#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;
string s;
int n;
vector<vector<set<string>>> dp;
set<string> f(int i, int type) {
if (i == n) return {""} ;
if (i == n - 1) {
return {string(1, s[n-1])};
}
if (!dp[i][type].empty()) {
return dp[i][type];
}
set<string>& st = dp[i][type];
st.insert(s.substr(i, n - i));
if (type == 0) {
set<string> st1 = f(i+1, 0);
st.insert(all(st1));
char c = s[i];
set<string> st2 = f(i+2, 1);
for (auto &e : st2) {
string s1 = string(1, c) + e;
st.insert(s1);
}
return st ;
}
set < string > st2 = f(i+1 , 1) ;
st.insert(all(st2)) ;
return st;
}
void solve() {
cin >> n;
cin >> s;
dp.assign(n, vector<set<string>>(2));
set<string> ans = f(0, 0);
cout << ans.size() << 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+LCByYl90cmVlX3RhZywgdHJlZV9vcmRlcl9zdGF0aXN0aWNzX25vZGVfdXBkYXRlPjsKdHlwZWRlZiBsb25nIGxvbmcgbGw7CgojZGVmaW5lIGluZiAxZTkKI2RlZmluZSBNT0QgMTAwMDAwMDAwNwojZGVmaW5lIHZpbnQgdmVjdG9yPGludD4KI2RlZmluZSB2bGwgdmVjdG9yPGxsPgojZGVmaW5lIG5vIGNvdXQgPDwgIk5PIiA8PCBlbmRsOwojZGVmaW5lIHllcyBjb3V0IDw8ICJZRVMiIDw8IGVuZGw7CgpzdHJpbmcgczsKaW50IG47CnZlY3Rvcjx2ZWN0b3I8c2V0PHN0cmluZz4+PiBkcDsKCnNldDxzdHJpbmc+IGYoaW50IGksIGludCB0eXBlKSB7CiAgICBpZiAoaSA9PSBuKSByZXR1cm4geyIifSA7CiAgICBpZiAoaSA9PSBuIC0gMSkgewogICAgICAgIHJldHVybiB7c3RyaW5nKDEsIHNbbi0xXSl9OwogICAgfQoKICAgIGlmICghZHBbaV1bdHlwZV0uZW1wdHkoKSkgewogICAgICAgIHJldHVybiBkcFtpXVt0eXBlXTsKICAgIH0KCiAgICBzZXQ8c3RyaW5nPiYgc3QgPSBkcFtpXVt0eXBlXTsKICAgIHN0Lmluc2VydChzLnN1YnN0cihpLCBuIC0gaSkpOwoKCgogICAgaWYgKHR5cGUgPT0gMCkgewogICAgICAgIHNldDxzdHJpbmc+IHN0MSA9IGYoaSsxLCAwKTsKICAgICAgICBzdC5pbnNlcnQoYWxsKHN0MSkpOwogICAgICAgIGNoYXIgYyA9IHNbaV07CiAgICAgICAgc2V0PHN0cmluZz4gc3QyID0gZihpKzIsIDEpOwogICAgICAgIGZvciAoYXV0byAmZSA6IHN0MikgewogICAgICAgICAgICBzdHJpbmcgczEgPSBzdHJpbmcoMSwgYykgKyBlOwogICAgICAgICAgICBzdC5pbnNlcnQoczEpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gc3QgOwogICAgfQogICAgc2V0IDwgc3RyaW5nID4gc3QyID0gZihpKzEgLCAxKSA7CiAgICBzdC5pbnNlcnQoYWxsKHN0MikpIDsKCiAgICByZXR1cm4gc3Q7Cn0KCnZvaWQgc29sdmUoKSB7CiAgICBjaW4gPj4gbjsKICAgIGNpbiA+PiBzOwogICAgZHAuYXNzaWduKG4sIHZlY3RvcjxzZXQ8c3RyaW5nPj4oMikpOwoKICAgIHNldDxzdHJpbmc+IGFucyA9IGYoMCwgMCk7CiAgICBjb3V0IDw8IGFucy5zaXplKCkgPDwgZW5kbDsKfQoKaW50IG1haW4oKSB7CiAgICBpb3M6OnN5bmNfd2l0aF9zdGRpbyhmYWxzZSk7CiAgICBjaW4udGllKG51bGxwdHIpOwoKI2lmbmRlZiBPTkxJTkVfSlVER0UKICAgIGZyZW9wZW4oImlucHV0LnR4dCIsICJyIiwgc3RkaW4pOwogICAgZnJlb3Blbigib3V0cHV0LnR4dCIsICJ3Iiwgc3Rkb3V0KTsKI2VuZGlmCgogICAgaW50IHQgPSAxOwogICAgY2luID4+IHQ7CiAgICB3aGlsZSAodC0tKSB7CiAgICAgICAgc29sdmUoKTsKICAgIH0KICAgIHJldHVybiAwOwp9