#include <bits/stdc++.h>
using namespace std;
#define int long long int
#define double long double
const int M = 1000000007;
const int N = 3e5+9;
const int INF = 2e9+1;
const int MAXN = 100000;
const int LINF = 2000000000000000001;
//_ ***************************** 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']++;
small[a[e]-'a']++;
if(big[a[e]-'a'] == 1) bigSize++;
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 if(bigSize == k){
ans += (l-s);
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), 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']++;
small[a[e]-'a']++;
if(big[a[e]-'a'] == 1) bigSize++;
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;
}
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+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CiNkZWZpbmUgaW50ICAgICAgICAgICAgICBsb25nIGxvbmcgaW50CiNkZWZpbmUgZG91YmxlICAgICAgICAgICBsb25nIGRvdWJsZQoKCmNvbnN0IGludCBNID0gMTAwMDAwMDAwNzsKY29uc3QgaW50IE4gPSAzZTUrOTsKY29uc3QgaW50IElORiA9IDJlOSsxOwpjb25zdCBpbnQgTUFYTiA9IDEwMDAwMDsKY29uc3QgaW50IExJTkYgPSAyMDAwMDAwMDAwMDAwMDAwMDAxOwoKLy9fICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqIFNUQVJUIEJlbG93ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCgoKc3RyaW5nIGE7CgovLyogQ291bnQgb2YgRXhhY3RseSBrID0gKEF0bW9zdCBrICkgLSAoQXRtb3N0IGstMSApCgppbnQgYXRtb3N0SyhpbnQgbiwgaW50IGspewoJCgl2ZWN0b3I8aW50PiBtcCgyNik7CglpbnQgc2l6ZSA9IDA7CgkKCWludCBhbnMgPSAwOwoJaW50IHMgPSAwLCBlID0gMDsKCQoJd2hpbGUoZTxuKXsKCSAgICBtcFthW2VdLSdhJ10rKzsKCSAgICBpZihtcFthW2VdLSdhJ10gPT0gMSkgc2l6ZSsrOwoJICAgIAoJICAgIGlmKHNpemUgPCBrKXsKCSAgICAJYW5zICs9IChlLXMrMSk7CgkgICAgICAgIGUrKzsKCSAgICB9CgkgICAgZWxzZXsKCSAgICAgICAgd2hpbGUoczw9ZSAmJiBzaXplID4gayl7CgkgICAgICAgICAgICBtcFthW3NdLSdhJ10tLTsKCSAgICAgICAgICAgIGlmKG1wW2Fbc10gLSAnYSddID09IDApIHNpemUtLTsKCSAgICAgICAgICAgIHMrKzsKCSAgICAgICAgfQoJICAgICAgICBhbnMgKz0gKGUtcysxKTsKCSAgICAgICAgZSsrOwoJICAgIH0KCX0KCQoJcmV0dXJuIGFuczsKfQoKaW50IGNvbnNpc3RlbmN5MShpbnQgbiwgaW50IGspewoKCXJldHVybiBhdG1vc3RLKG4sIGspIC0gYXRtb3N0SyhuLCBrLTEpOwoJCn0KCgoKCi8vKiBUZW1wbGF0ZSAxCgoKaW50IGNvbnNpc3RlbmN5MihpbnQgbiwgaW50IGspewoJCgl2ZWN0b3I8aW50PiBiaWcoMjYpLCBzbWFsbCgyNik7CglpbnQgYmlnU2l6ZSA9IDAsIHNtYWxsU2l6ZSA9IDA7CgkKCWludCBhbnMgPSAwOwoJaW50IHMgPSAwLCBlID0gMDsKCWludCBsID0gMDsKCQoJd2hpbGUoZTxuKXsKCSAgICBiaWdbYVtlXS0nYSddKys7CgkgICAgc21hbGxbYVtlXS0nYSddKys7CgkgICAgaWYoYmlnW2FbZV0tJ2EnXSA9PSAxKSBiaWdTaXplKys7CgkgICAgaWYoc21hbGxbYVtlXS0nYSddID09IDEpIHNtYWxsU2l6ZSsrOwoJICAgIAoJICAgIHdoaWxlKGw8PWUgJiYgc21hbGxTaXplID49IGspewoJICAgICAgICBzbWFsbFthW2xdLSdhJ10tLTsKCSAgICAgICAgaWYoc21hbGxbYVtsXS0nYSddID09IDApIHNtYWxsU2l6ZS0tOwoJICAgICAgICBsKys7CgkgICAgfQoJICAgIAoJICAgIGlmKGJpZ1NpemUgPCBrKXsKCSAgICAgICAgZSsrOwoJICAgIH0KCSAgICBlbHNlIGlmKGJpZ1NpemUgPT0gayl7CgkgICAgCWFucyArPSAobC1zKTsKCSAgICAJZSsrOwoJICAgIH0KCSAgICBlbHNlewoJICAgICAgICB3aGlsZShzPD1lICYmIGJpZ1NpemUgPiBrKXsKCSAgICAgICAgICAgIGJpZ1thW3NdLSdhJ10tLTsKCSAgICAgICAgICAgIGlmKGJpZ1thW3NdIC0gJ2EnXSA9PSAwKSBiaWdTaXplLS07CgkgICAgICAgICAgICBzKys7CgkgICAgICAgIH0KCSAgICAgICAgYW5zICs9IChsLXMpOwoJICAgICAgICBlKys7CgkgICAgfQoJfQoJCglyZXR1cm4gYW5zOwoKfQoKCgoKLy8qIFRlbXBsYXRlIDIKCmludCBjb25zaXN0ZW5jeTMoaW50IG4sIGludCBrKXsKCQoJdmVjdG9yPGludD4gYmlnKDI2KSwgc21hbGwoMjYpOwoJaW50IGJpZ1NpemUgPSAwLCBzbWFsbFNpemUgPSAwOwoJCglpbnQgYW5zID0gMDsKCWludCBzID0gMCwgZSA9IDA7CglpbnQgbCA9IDA7CgkKCXdoaWxlKGU8bil7CgkgICAgYmlnW2FbZV0tJ2EnXSsrOwoJICAgIHNtYWxsW2FbZV0tJ2EnXSsrOwoJICAgIGlmKGJpZ1thW2VdLSdhJ10gPT0gMSkgYmlnU2l6ZSsrOwoJICAgIGlmKHNtYWxsW2FbZV0tJ2EnXSA9PSAxKSBzbWFsbFNpemUrKzsKCSAgICAKCSAgICB3aGlsZShsPD1lICYmIHNtYWxsU2l6ZSA+PSBrKXsKCSAgICAgICAgc21hbGxbYVtsXS0nYSddLS07CgkgICAgICAgIGlmKHNtYWxsW2FbbF0tJ2EnXSA9PSAwKSBzbWFsbFNpemUtLTsKCSAgICAgICAgbCsrOwoJICAgIH0KCSAgICAKCSAgICBpZihiaWdTaXplIDwgayl7CgkgICAgICAgIGUrKzsKCSAgICB9CgkgICAgZWxzZXsKCSAgICAgICAgd2hpbGUoczw9ZSAmJiBiaWdTaXplID4gayl7CgkgICAgICAgICAgICBiaWdbYVtzXS0nYSddLS07CgkgICAgICAgICAgICBpZihiaWdbYVtzXSAtICdhJ10gPT0gMCkgYmlnU2l6ZS0tOwoJICAgICAgICAgICAgcysrOwoJICAgICAgICB9CgkgICAgICAgIGFucyArPSAobC1zKTsKCSAgICAgICAgZSsrOwoJICAgIH0KCX0KCQoJcmV0dXJuIGFuczsKfQoKCgoKCgoKCgppbnQgcHJhY3RpY2UoaW50IG4sIGludCBrKXsKCQoJcmV0dXJuIDA7CQp9CgoKCgp2b2lkIHNvbHZlKCkgewoKCWludCBrOwoJY2luID4+IGsgPj4gYTsKCWludCBuID0gYS5zaXplKCk7CgoJY291dCA8PCBjb25zaXN0ZW5jeTEobiwgaykgPDwgIiAiIDw8IGNvbnNpc3RlbmN5MihuLGspIDw8ICAiICIgPDwgY29uc2lzdGVuY3kzKG4saykgPDwgZW5kbDsKCQoJLy8gY291dCA8PCBjb25zaXN0ZW5jeTEobiwgaykgPDwgIiAtPiAiIDw8IHByYWN0aWNlKG4sIGspIDw8IGVuZGw7CgkKfQoKCgoKCmludDMyX3QgbWFpbigpIHsKICAgIGlvc19iYXNlOjpzeW5jX3dpdGhfc3RkaW8oMCk7IGNpbi50aWUoMCk7IGNvdXQudGllKDApOwoKICAgIGludCB0ID0gMTsKICAgIGNpbiA+PiB0OwogICAgd2hpbGUgKHQtLSkgewogICAgICAgIHNvbHZlKCk7CiAgICB9CgogICAgcmV0dXJuIDA7Cn0=