/* * author: bwayne `-._: .:' `::: .:\ |\__/| /:: .:' `::: .:.-' \ : \ |: | / : / \ :: . `-_______/ :: \_______-' . :: . / | : :: ::' : :: ::' : :: ::' :: ::' : :: :| | ;:: ;:: ;:: ;:: ;:: | | .:' `::: .:' `::: .:' `::: .:' `::: .:' `:| / : : : : : \ /______::_____ :: . :: . :: _____._::____\ `----._:: ::' : :: ::' _.----' `--. ;:: .--' `-. .:' .-' \ / \ / \/ */ #include<bits/stdc++.h> using namespace std; #define ff first #define ss second #define pb push_back #define mp make_pair #define ll long long #define ld long double #define pii pair<ll,ll> #define vi vector<ll> #define mii map<ll,ll> #define pqi priority_queue<ll> //max pq #define pqd priority_queue<ll,vi,greater<ll> > #define setbits(x) __builtin_popcountll(x) #define zrobits(x) __builtin_ctzll(x) #define MOD 1000000007 #define inf 1e18 #define ps(x,y) fixed<<setprecision(y)<<x #define pw(b,p) pow(b,p) + 0.1 #define f(i,k,n) for(ll i=k;i<n;i++) #define fd(i,start,end) for(ll i=start;i>=end;i--) #define LSOne(S) (S & (-S)) ll power(ll a, ll b, ll mod) {ll res = 1; a %= mod; assert(b >= 0); for (; b; b >>= 1) {if (b & 1)res = res * a % mod; a = a * a % mod;} return res;} ll power(ll a, ll b) {ll res = 1; assert(b >= 0); for (; b; b >>= 1) {if (b & 1)res = res * a ; a = a * a;} return res;} ll min( ll a, ll b) { return (a < b) ? a : b;} ll max(ll a, ll b) {return (a > b) ? a : b;} ll gcd (ll a, ll b) {if (a == 0) return b; return gcd(b % a, a);} ll mul(ll a, ll b) { return (1LL * a * b) % MOD; } ll add(ll a, ll b) { ll s = (a + b); if (s >= MOD) s -= MOD; return s; } ll sub(ll a, ll b) { ll s = (a + MOD - b); if (s >= MOD) s -= MOD; return s; } void bwayne() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); #ifndef ONLINE_JUDGE freopen("input.txt", "r", stdin); freopen("output.txt", "w", stdout); #endif } // ll n; // cin >> n; // vi a(n); // f(i, 0, n) { // cin >> a[i]; // } // vector<vi> a(n,vector<ll>(m,0)); // f(i,0,n){ // f(j,0,m){ // cin>>a[i][j]; // } // } void solve() { ll n; cin >> n; string a; cin >> a; ll i = 0; vector<vi> v(26); while (i < n) { char now = a[i]; ll count = 0; while (i < n && a[i] == now) { i++; count++; } v[now - 'a'].pb(count); } for (int i = 0; i < 26; i++) { sort(v[i].begin(), v[i].end(), greater<ll>()); } vi dp(n + 1, 0); for (int i = 0; i < 26; i++) { ll past = 0; for (int j = 0; j < v[i].size(); j++) { ll now = v[i][j]; dp[j] = max(dp[j], now + past); past += now; } } for (int i = 1; i <= n; i++) { dp[i] = max(dp[i], dp[i - 1]); } f(i, 0, n + 1) { cout << dp[i] << " "; } cout << endl; } int main() { bwayne();// remember ll t = 1; cin >> t; for (ll tt = 1; tt <= t; tt++) { // cout << "Case #" << tt << ": "; solve(); } return 0; }