#include <bits/stdc++.h>
using namespace std;
#define pb push_back
#define all(x) x.begin(), x.end()
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace __gnu_pbds;
template <typename T> using o_set = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
template <typename T, typename R> using o_map = tree<T, R, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
typedef long long ll;
#define inf 1e9
#define MOD 1000000007
#define vint vector<int>
#define vll vector<ll>
#define no cout << "NO" << endl;
#define yes cout << "YES" << endl;
void solve() {
ll n ; cin >> n ;
string s ; cin >> s ;
map < char, int > freq ;
vector < ll > dp(n+1 ,0 ) ;
for (auto e : s ) freq[e] ++ ;
dp[n] = freq.size() ;
for (int i = n -1 ; i >= 0 ; i -- ) {
if (freq[s[i]] == 1 ) dp[i] = dp[i+1] - 1 ;
else dp[i] = dp[i+1] ;
freq[s[i]] -=1 ;
// cout << dp[i] <<"hhh" << endl ;
}
ll ans = 0 ;
for (int i = 0 ; i<= n ; i++) ans += dp[i] ;
cout << ans << endl ;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
#ifndef ONLINE_JUDGE
freopen("input.txt", "r", stdin);
freopen("output.txt", "w", stdout);
#endif
int t = 1;
cin >> t;
while (t--) {
solve();
}
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgojZGVmaW5lIHBiIHB1c2hfYmFjawojZGVmaW5lIGFsbCh4KSB4LmJlZ2luKCksIHguZW5kKCkKI2luY2x1ZGUgPGV4dC9wYl9kcy9hc3NvY19jb250YWluZXIuaHBwPgojaW5jbHVkZSA8ZXh0L3BiX2RzL3RyZWVfcG9saWN5LmhwcD4KdXNpbmcgbmFtZXNwYWNlIF9fZ251X3BiZHM7CnRlbXBsYXRlIDx0eXBlbmFtZSBUPiB1c2luZyBvX3NldCA9IHRyZWU8VCwgbnVsbF90eXBlLCBsZXNzPFQ+LCByYl90cmVlX3RhZywgdHJlZV9vcmRlcl9zdGF0aXN0aWNzX25vZGVfdXBkYXRlPjsKdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFI+IHVzaW5nIG9fbWFwID0gdHJlZTxULCBSLCBsZXNzPFQ+LCByYl90cmVlX3RhZywgdHJlZV9vcmRlcl9zdGF0aXN0aWNzX25vZGVfdXBkYXRlPjsKdHlwZWRlZiBsb25nIGxvbmcgbGw7CgojZGVmaW5lIGluZiAxZTkKI2RlZmluZSBNT0QgMTAwMDAwMDAwNwojZGVmaW5lIHZpbnQgdmVjdG9yPGludD4KI2RlZmluZSB2bGwgdmVjdG9yPGxsPgojZGVmaW5lIG5vIGNvdXQgPDwgIk5PIiA8PCBlbmRsOwojZGVmaW5lIHllcyBjb3V0IDw8ICJZRVMiIDw8IGVuZGw7Cgp2b2lkIHNvbHZlKCkgewogICAgbGwgbiA7IGNpbiA+PiBuIDsKICAgIHN0cmluZyBzIDsgY2luID4+IHMgOwogICAgbWFwIDwgY2hhciwgaW50ID4gZnJlcSA7CiAgICB2ZWN0b3IgPCBsbCA+IGRwKG4rMSAsMCApIDsKICAgIGZvciAoYXV0byBlIDogcyApIGZyZXFbZV0gKysgOwogICAgZHBbbl0gPSBmcmVxLnNpemUoKSA7CgoKICAgIGZvciAoaW50IGkgPSBuIC0xIDsgaSAgPj0gMCA7IGkgLS0gKSB7CiAgICAgICAgaWYgKGZyZXFbc1tpXV0gPT0gMSApIGRwW2ldID0gZHBbaSsxXSAtIDEgOwogICAgICAgIGVsc2UgZHBbaV0gPSBkcFtpKzFdIDsKICAgICAgICBmcmVxW3NbaV1dIC09MSA7CiAgICAvLyAgICBjb3V0IDw8IGRwW2ldIDw8ImhoaCIgPDwgIGVuZGwgOwogICAgfQogICAgbGwgYW5zID0gMCA7CiAgICBmb3IgKGludCAgaSA9IDAgOyBpPD0gIG4gOyBpKyspIGFucyArPSBkcFtpXSA7CiAgICBjb3V0IDw8IGFucyA8PCBlbmRsIDsKCn0KaW50IG1haW4oKSB7CiAgICBpb3M6OnN5bmNfd2l0aF9zdGRpbyhmYWxzZSk7CiAgICBjaW4udGllKG51bGxwdHIpOwoKI2lmbmRlZiBPTkxJTkVfSlVER0UKICAgIGZyZW9wZW4oImlucHV0LnR4dCIsICJyIiwgc3RkaW4pOwogICAgZnJlb3Blbigib3V0cHV0LnR4dCIsICJ3Iiwgc3Rkb3V0KTsKI2VuZGlmCgogICAgaW50IHQgPSAxOwoKICAgIGNpbiA+PiB0OwogICAgd2hpbGUgKHQtLSkgewogICAgICAgIHNvbHZlKCk7CiAgICB9CiAgICByZXR1cm4gMDsKfQo=