#include <bits/stdc++.h>
using namespace std;
#define int long long int
#define double long double
#define print(a) for(auto x : a) cout << x << " "; cout << endl
const int M = 1000000007;
const int N = 3e5+9;
const int INF = 2e9+1;
const int LINF = 2000000000000000001;
inline int power(int a, int b, int mod=M) {
int x = 1;
a %= mod;
while (b) {
if (b & 1) x = (x * a) % mod;
a = (a * a) % mod;
b >>= 1;
}
return x;
}
//_ ***************************** START Below *******************************
string a;
//* Count of Exactly k = (Atmost k ) - (Atmost k-1 )
int atmostK(int n, int k){
vector<int> mp(26);
int size = 0;
int ans = 0;
int s = 0, e = 0;
while(e<n){
mp[a[e]-'a']++;
if(mp[a[e]-'a'] == 1) size++;
if(size < k){
ans += (e-s+1);
e++;
}
else{
while(s<=e && size > k){
mp[a[s]-'a']--;
if(mp[a[s] - 'a'] == 0) size--;
s++;
}
ans += (e-s+1);
e++;
}
}
return ans;
}
int consistency1(int n, int k){
return atmostK(n, k) - atmostK(n, k-1);
}
//* Template 1
int consistency2(int n, int k){
vector<int> big(26), small(26);
int bigSize = 0, smallSize = 0;
int ans = 0;
int s = 0, e = 0;
int l = 0;
while(e<n){
big[a[e]-'a']++;
if(big[a[e]-'a'] == 1) bigSize++;
small[a[e]-'a']++;
if(small[a[e]-'a'] == 1) smallSize++;
while(l<=e && smallSize >= k){
small[a[l]-'a']--;
if(small[a[l]-'a'] == 0) smallSize--;
l++;
}
if(bigSize < k){
e++;
}
else{
while(s<=e && bigSize > k){
big[a[s]-'a']--;
if(big[a[s] - 'a'] == 0) bigSize--;
s++;
}
ans += (l-s);
e++;
}
}
return ans;
}
//* Template 2
int consistency3(int n, int k){
vector<int> big(26), sm(26);
int bigSz = 0, smSz = 0;
int ans = 0;
for(int j=0, i=0, l=0; j<n; j++){
big[a[j]-'a']++;
if(big[a[j] - 'a'] == 1) bigSz++;
sm[a[j]-'a']++;
if(sm[a[j] - 'a'] == 1) smSz++;
while(l<=j && smSz >= k){
sm[a[l]-'a']--;
if(sm[a[l] - 'a'] == 0) smSz--;
l++;
}
while(i<=j && bigSz > k){
big[a[i] - 'a']--;
if(big[a[i] - 'a'] == 0) bigSz--;
i++;
}
ans += l-i;
}
return ans;
}
int practice(int n, int k){
return 0;
}
void solve() {
int k;
cin >> k >> a;
int n = a.size();
cout << consistency1(n, k) << " " << consistency2(n,k) << " " << consistency3(n,k) << endl;
// cout << consistency1(n, k) << " -> " << practice(n, k) << endl;
}
int32_t main() {
ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
int t = 1;
cin >> t;
while (t--) {
solve();
}
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CiNkZWZpbmUgaW50ICAgICAgICAgICAgICBsb25nIGxvbmcgaW50CiNkZWZpbmUgZG91YmxlICAgICAgICAgICBsb25nIGRvdWJsZQojZGVmaW5lIHByaW50KGEpICAgICAgICAgZm9yKGF1dG8geCA6IGEpIGNvdXQgPDwgeCA8PCAiICI7IGNvdXQgPDwgZW5kbAoKCmNvbnN0IGludCBNID0gMTAwMDAwMDAwNzsKY29uc3QgaW50IE4gPSAzZTUrOTsKY29uc3QgaW50IElORiA9IDJlOSsxOwpjb25zdCBpbnQgTElORiA9IDIwMDAwMDAwMDAwMDAwMDAwMDE7CgppbmxpbmUgaW50IHBvd2VyKGludCBhLCBpbnQgYiwgaW50IG1vZD1NKSB7CiAgICBpbnQgeCA9IDE7CiAgICBhICU9IG1vZDsKICAgIHdoaWxlIChiKSB7CiAgICAgICAgaWYgKGIgJiAxKSB4ID0gKHggKiBhKSAlIG1vZDsgCiAgICAgICAgYSA9IChhICogYSkgJSBtb2Q7CiAgICAgICAgYiA+Pj0gMTsKICAgIH0KICAgIHJldHVybiB4Owp9CgoKLy9fICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqIFNUQVJUIEJlbG93ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCgoKc3RyaW5nIGE7CgovLyogQ291bnQgb2YgRXhhY3RseSBrID0gKEF0bW9zdCBrICkgLSAoQXRtb3N0IGstMSApCgppbnQgYXRtb3N0SyhpbnQgbiwgaW50IGspewoJCgl2ZWN0b3I8aW50PiBtcCgyNik7CglpbnQgc2l6ZSA9IDA7CgkKCWludCBhbnMgPSAwOwoJaW50IHMgPSAwLCBlID0gMDsKCQoJd2hpbGUoZTxuKXsKCSAgICBtcFthW2VdLSdhJ10rKzsKCSAgICBpZihtcFthW2VdLSdhJ10gPT0gMSkgc2l6ZSsrOwoJICAgIAoJICAgIGlmKHNpemUgPCBrKXsKCSAgICAJYW5zICs9IChlLXMrMSk7CgkgICAgICAgIGUrKzsKCSAgICB9CgkgICAgZWxzZXsKCSAgICAgICAgd2hpbGUoczw9ZSAmJiBzaXplID4gayl7CgkgICAgICAgICAgICBtcFthW3NdLSdhJ10tLTsKCSAgICAgICAgICAgIGlmKG1wW2Fbc10gLSAnYSddID09IDApIHNpemUtLTsKCSAgICAgICAgICAgIHMrKzsKCSAgICAgICAgfQoJICAgICAgICBhbnMgKz0gKGUtcysxKTsKCSAgICAgICAgZSsrOwoJICAgIH0KCX0KCQoJcmV0dXJuIGFuczsKfQoKaW50IGNvbnNpc3RlbmN5MShpbnQgbiwgaW50IGspewoKCXJldHVybiBhdG1vc3RLKG4sIGspIC0gYXRtb3N0SyhuLCBrLTEpOwoJCn0KCgoKCgoKCi8vKiBUZW1wbGF0ZSAxCgoKaW50IGNvbnNpc3RlbmN5MihpbnQgbiwgaW50IGspewoJCgl2ZWN0b3I8aW50PiBiaWcoMjYpLCBzbWFsbCgyNik7CglpbnQgYmlnU2l6ZSA9IDAsIHNtYWxsU2l6ZSA9IDA7CgkKCWludCBhbnMgPSAwOwoJaW50IHMgPSAwLCBlID0gMDsKCWludCBsID0gMDsKCQoJd2hpbGUoZTxuKXsKCQkKCSAgICBiaWdbYVtlXS0nYSddKys7CgkgICAgaWYoYmlnW2FbZV0tJ2EnXSA9PSAxKSBiaWdTaXplKys7CgkgICAgCgkgICAgc21hbGxbYVtlXS0nYSddKys7CgkgICAgaWYoc21hbGxbYVtlXS0nYSddID09IDEpIHNtYWxsU2l6ZSsrOwoJICAgIAoJICAgIHdoaWxlKGw8PWUgJiYgc21hbGxTaXplID49IGspewoJICAgICAgICBzbWFsbFthW2xdLSdhJ10tLTsKCSAgICAgICAgaWYoc21hbGxbYVtsXS0nYSddID09IDApIHNtYWxsU2l6ZS0tOwoJICAgICAgICBsKys7CgkgICAgfQoJICAgIAoJICAgIGlmKGJpZ1NpemUgPCBrKXsKCSAgICAgICAgZSsrOwoJICAgIH0KCSAgICBlbHNlewoJICAgICAgICB3aGlsZShzPD1lICYmIGJpZ1NpemUgPiBrKXsKCSAgICAgICAgICAgIGJpZ1thW3NdLSdhJ10tLTsKCSAgICAgICAgICAgIGlmKGJpZ1thW3NdIC0gJ2EnXSA9PSAwKSBiaWdTaXplLS07CgkgICAgICAgICAgICBzKys7CgkgICAgICAgIH0KCSAgICAgICAgYW5zICs9IChsLXMpOwoJICAgICAgICBlKys7CgkgICAgfQoJfQoJCglyZXR1cm4gYW5zOwoKfQoKCgoKCgoKLy8qIFRlbXBsYXRlIDIKaW50IGNvbnNpc3RlbmN5MyhpbnQgbiwgaW50IGspewogICAgICAgIAogICAgdmVjdG9yPGludD4gYmlnKDI2KSwgc20oMjYpOwogICAgaW50IGJpZ1N6ID0gMCwgc21TeiA9IDA7CiAgICAKICAgIGludCBhbnMgPSAwOwogICAgCiAgICBmb3IoaW50IGo9MCwgaT0wLCBsPTA7IGo8bjsgaisrKXsKICAgIAkKICAgICAgICBiaWdbYVtqXS0nYSddKys7CiAgICAgICAgaWYoYmlnW2Fbal0gLSAnYSddID09IDEpIGJpZ1N6Kys7CiAgICAgICAgCiAgICAgICAgc21bYVtqXS0nYSddKys7CiAgICAgICAgaWYoc21bYVtqXSAtICdhJ10gPT0gMSkgc21TeisrOwogICAgICAgIAogICAgICAgIAogICAgICAgIHdoaWxlKGw8PWogJiYgc21TeiA+PSBrKXsKICAgICAgICAgICAgc21bYVtsXS0nYSddLS07CiAgICAgICAgICAgIGlmKHNtW2FbbF0gLSAnYSddID09IDApIHNtU3otLTsKICAgICAgICAgICAgbCsrOwogICAgICAgIH0KICAgICAgICAKICAgICAgICB3aGlsZShpPD1qICYmIGJpZ1N6ID4gayl7CiAgICAgICAgICAgIGJpZ1thW2ldIC0gJ2EnXS0tOwogICAgICAgICAgICBpZihiaWdbYVtpXSAtICdhJ10gPT0gMCkgYmlnU3otLTsKICAgICAgICAgICAgaSsrOwogICAgICAgIH0KICAgICAgICAKICAgICAgICBhbnMgKz0gbC1pOwogICAgICAgIAogICAgfQogICAgcmV0dXJuIGFuczsKfQoKCgoKCgoKCgoKCgoKCgoKaW50IHByYWN0aWNlKGludCBuLCBpbnQgayl7CgkKCXJldHVybiAwOwkKfQoKCgoKdm9pZCBzb2x2ZSgpIHsKCglpbnQgazsKCWNpbiA+PiBrID4+IGE7CglpbnQgbiA9IGEuc2l6ZSgpOwoKCWNvdXQgPDwgY29uc2lzdGVuY3kxKG4sIGspIDw8ICIgIiA8PCBjb25zaXN0ZW5jeTIobixrKSA8PCAgIiAiIDw8IGNvbnNpc3RlbmN5MyhuLGspIDw8IGVuZGw7CgkKCS8vIGNvdXQgPDwgY29uc2lzdGVuY3kxKG4sIGspIDw8ICIgLT4gIiA8PCBwcmFjdGljZShuLCBrKSA8PCBlbmRsOwoJCn0KCgoKCgppbnQzMl90IG1haW4oKSB7CiAgICBpb3NfYmFzZTo6c3luY193aXRoX3N0ZGlvKDApOyBjaW4udGllKDApOyBjb3V0LnRpZSgwKTsKCiAgICBpbnQgdCA9IDE7CiAgICBjaW4gPj4gdDsKICAgIHdoaWxlICh0LS0pIHsKICAgICAgICBzb2x2ZSgpOwogICAgfQoKICAgIHJldHVybiAwOwp9