#pragma GCC optimize("O3", "unroll-loops")
#include<iostream>
#include<algorithm>
#include<iomanip>
#include<cstring>
#include<vector>
#include<map>
#include<set>
#include<queue>
#include<stack>
#include<cmath>
#include<climits>
#include<numeric>
using namespace std;
#define fastio() ios::sync_with_stdio(NULL);cin.tie(0);cout.tie(0);
#define int long long
#define SZ(x) (int)x.size()
#define ALL(x) (x).begin(), (x).end()
#define RALL(x) (x).rbegin(), (x).rend()
#define trav(a) for(auto p:a)cout<<p<<" ";cout<<"\n";
const int MOD = 998244353;
const long long INF = 1e18 + 42;
//••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••
/*Theorems reminder:
Wilson : (p-1)! mod p = -1 or p-1, p is prime
Fermet : a^-1 mod p = a^(p-2) mod p, p is prime,a^(p-1) = 1 mod p
exteuclid, modInverse, matrixExp., sieve
*/
inline void read (int*a, int n) {
for (int i = 0; i < n; i++) cin >> a[i];
}
inline void read (vector<int>&a) {
for (auto &x : a) cin >> x;
}
inline int add (int a, int b, int mod = MOD) {
a += b; return a >= mod ? a - mod : a;
}
inline int sub (int a, int b, int mod = MOD) {
a -= b; return a < 0 ? a + mod : a;
}
inline int mul (int a, int b, int mod = MOD) {
return (int) ( (long long) ((a % mod) * (b % mod)) % mod);
}
inline int mpow (long long base, long long ex, int mod = MOD) {
int res = 1;
for (; ex > 0; ex >>= 1) {
if (ex & 1) res = mul (res, base, mod);
base = mul (base, base, mod);
}
return res;
}
inline int inv (int a, int mod = MOD) {
return mpow (a, mod - 2, mod);
}
inline int __ceil (int n, int d) {
return (n + d - 1) / d;
}
//••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••
int dp[1000001][2][2];
int getAns(int i, string &s, int n, int f, int r) {
if (i >= (n + 1) / 2) {
return f == 1 || r == 1;
}
if (dp[i][f][r] != -1)return dp[i][f][r];
int ans = 0;
if (f) {
if (n % 2 == 1)
ans = mpow(26LL, n / 2 - i + 1) % MOD;
else {
ans = mpow(26LL, n / 2 - i) % MOD;
}
}
else {
for (char c = 'A'; c <= s[i]; c++) {
if (c < s[i]) {
ans = add(ans, getAns(i + 1, s, n, 1, r) % MOD);
}
else {
if (s[n - i - 1] < s[i]) {
ans = add(ans, getAns(i + 1, s, n, f, 0) % MOD);
}
else
ans = add(ans, getAns(i + 1, s, n, f, r | (s[i] < (s[n - i - 1]))) % MOD);
}
}
}
return dp[i][f][r] = ans;
}
bool isPal(string &s) {
for (int i = 0; i < SZ(s) / 2; i++) {
if (s[i] != s[SZ(s) - i - 1])return false;
}
return true;
}
void SolveCase() {
int n;
cin >> n;
string s;
cin >> s;
int f = 0;
if (isPal(s))f = 1;
for (int i = 0; i <= n; i++) {
dp[i][0][0] = dp[i][1][0] = -1;
dp[i][0][1] = dp[i][1][1] = -1;
}
cout << getAns(0, s, n, 0, 0) + f << "\n";
}
signed main()
{
fastio()
int tt = 1; cin >> tt;
for (int t = 1; t <= tt; t++) {
// cout << "Case #" << t << ": ";
SolveCase();
}
// cerr << "Time : " << 1000 * ( (double) clock() ) / (double) CLOCKS_PER_SEC << "ms\n";
}
I3ByYWdtYSBHQ0Mgb3B0aW1pemUoIk8zIiwgInVucm9sbC1sb29wcyIpCiNpbmNsdWRlPGlvc3RyZWFtPgojaW5jbHVkZTxhbGdvcml0aG0+CiNpbmNsdWRlPGlvbWFuaXA+CiNpbmNsdWRlPGNzdHJpbmc+CiNpbmNsdWRlPHZlY3Rvcj4KI2luY2x1ZGU8bWFwPgojaW5jbHVkZTxzZXQ+CiNpbmNsdWRlPHF1ZXVlPgojaW5jbHVkZTxzdGFjaz4KI2luY2x1ZGU8Y21hdGg+CiNpbmNsdWRlPGNsaW1pdHM+CiNpbmNsdWRlPG51bWVyaWM+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CiNkZWZpbmUgZmFzdGlvKCkgaW9zOjpzeW5jX3dpdGhfc3RkaW8oTlVMTCk7Y2luLnRpZSgwKTtjb3V0LnRpZSgwKTsKI2RlZmluZSBpbnQgbG9uZyBsb25nCiNkZWZpbmUgU1ooeCkgKGludCl4LnNpemUoKQojZGVmaW5lIEFMTCh4KSAoeCkuYmVnaW4oKSwgKHgpLmVuZCgpCiNkZWZpbmUgUkFMTCh4KSAoeCkucmJlZ2luKCksICh4KS5yZW5kKCkKI2RlZmluZSB0cmF2KGEpIGZvcihhdXRvIHA6YSljb3V0PDxwPDwiICI7Y291dDw8IlxuIjsKY29uc3QgaW50IE1PRCA9IDk5ODI0NDM1MzsKY29uc3QgbG9uZyBsb25nIElORiA9IDFlMTggKyA0MjsKLy/igKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKIKLypUaGVvcmVtcyByZW1pbmRlcjoKV2lsc29uIDogKHAtMSkhIG1vZCBwID0gLTEgb3IgcC0xLCBwIGlzIHByaW1lCkZlcm1ldCA6IGFeLTEgbW9kIHAgPSBhXihwLTIpIG1vZCBwLCBwIGlzIHByaW1lLGFeKHAtMSkgPSAxIG1vZCBwCmV4dGV1Y2xpZCwgbW9kSW52ZXJzZSwgbWF0cml4RXhwLiwgc2lldmUKKi8KaW5saW5lIHZvaWQgcmVhZCAoaW50KmEsIGludCBuKSB7CiAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSBjaW4gPj4gYVtpXTsKfQppbmxpbmUgdm9pZCByZWFkICh2ZWN0b3I8aW50PiZhKSB7CiAgICAgIGZvciAoYXV0byAmeCA6IGEpIGNpbiA+PiB4Owp9CmlubGluZSBpbnQgYWRkIChpbnQgYSwgaW50IGIsIGludCBtb2QgPSBNT0QpIHsKICAgICAgYSArPSBiOyByZXR1cm4gYSA+PSBtb2QgPyBhIC0gbW9kIDogYTsKfQppbmxpbmUgaW50IHN1YiAoaW50IGEsIGludCBiLCBpbnQgbW9kID0gTU9EKSB7CiAgICAgIGEgLT0gYjsgcmV0dXJuIGEgPCAwID8gYSArIG1vZCA6IGE7Cn0KaW5saW5lIGludCBtdWwgKGludCBhLCBpbnQgYiwgaW50IG1vZCA9IE1PRCkgewogICAgICByZXR1cm4gKGludCkgKCAobG9uZyBsb25nKSAoKGEgJSBtb2QpICogKGIgJSBtb2QpKSAlIG1vZCk7Cn0KaW5saW5lIGludCBtcG93IChsb25nIGxvbmcgYmFzZSwgbG9uZyBsb25nIGV4LCBpbnQgbW9kID0gTU9EKSB7CiAgICAgIGludCByZXMgPSAxOwogICAgICBmb3IgKDsgZXggPiAwOyBleCA+Pj0gMSkgewogICAgICAgICAgICBpZiAoZXggJiAxKSByZXMgPSBtdWwgKHJlcywgYmFzZSwgbW9kKTsKICAgICAgICAgICAgYmFzZSA9IG11bCAoYmFzZSwgYmFzZSwgbW9kKTsKICAgICAgfQogICAgICByZXR1cm4gcmVzOwp9CmlubGluZSBpbnQgaW52IChpbnQgYSwgaW50IG1vZCA9IE1PRCkgewogICAgICByZXR1cm4gbXBvdyAoYSwgbW9kIC0gMiwgbW9kKTsKfQppbmxpbmUgaW50IF9fY2VpbCAoaW50IG4sIGludCBkKSB7CiAgICAgIHJldHVybiAobiArIGQgLSAxKSAvIGQ7Cn0KLy/igKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKLigKIKCgoKCmludCBkcFsxMDAwMDAxXVsyXVsyXTsKaW50IGdldEFucyhpbnQgaSwgc3RyaW5nICZzLCBpbnQgbiwgaW50IGYsIGludCByKSB7CiAgICAgIGlmIChpID49IChuICsgMSkgLyAyKSB7CiAgICAgICAgICAgIHJldHVybiBmID09IDEgfHwgciA9PSAxOwogICAgICB9CgoKICAgICAgaWYgKGRwW2ldW2ZdW3JdICE9IC0xKXJldHVybiBkcFtpXVtmXVtyXTsKCiAgICAgIGludCBhbnMgPSAwOwogICAgICBpZiAoZikgewogICAgICAgICAgICBpZiAobiAlIDIgPT0gMSkKICAgICAgICAgICAgICAgICAgYW5zID0gbXBvdygyNkxMLCBuIC8gMiAtIGkgKyAxKSAlIE1PRDsKICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgIGFucyA9IG1wb3coMjZMTCwgbiAvIDIgLSBpKSAlIE1PRDsKICAgICAgICAgICAgfQogICAgICB9CiAgICAgIGVsc2UgewogICAgICAgICAgICBmb3IgKGNoYXIgYyA9ICdBJzsgYyA8PSBzW2ldOyBjKyspIHsKICAgICAgICAgICAgICAgICAgaWYgKGMgPCBzW2ldKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGFucyA9IGFkZChhbnMsIGdldEFucyhpICsgMSwgcywgbiwgMSwgcikgJSBNT0QpOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc1tuIC0gaSAtIDFdIDwgc1tpXSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbnMgPSBhZGQoYW5zLCBnZXRBbnMoaSArIDEsIHMsIG4sIGYsIDApICUgTU9EKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFucyA9IGFkZChhbnMsIGdldEFucyhpICsgMSwgcywgbiwgZiwgciB8IChzW2ldIDwgKHNbbiAtIGkgLSAxXSkpKSAlIE1PRCk7CiAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gZHBbaV1bZl1bcl0gPSBhbnM7Cn0KYm9vbCBpc1BhbChzdHJpbmcgJnMpIHsKICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBTWihzKSAvIDI7IGkrKykgewogICAgICAgICAgICBpZiAoc1tpXSAhPSBzW1NaKHMpIC0gaSAtIDFdKXJldHVybiBmYWxzZTsKICAgICAgfQogICAgICByZXR1cm4gdHJ1ZTsKfQp2b2lkIFNvbHZlQ2FzZSgpIHsKCgoKICAgICAgaW50IG47CiAgICAgIGNpbiA+PiBuOwogICAgICBzdHJpbmcgczsKICAgICAgY2luID4+IHM7CgogICAgICBpbnQgZiA9IDA7CiAgICAgIGlmIChpc1BhbChzKSlmID0gMTsKICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPD0gbjsgaSsrKSB7CiAgICAgICAgICAgIGRwW2ldWzBdWzBdID0gZHBbaV1bMV1bMF0gPSAtMTsKICAgICAgICAgICAgZHBbaV1bMF1bMV0gPSBkcFtpXVsxXVsxXSA9IC0xOwogICAgICB9CgogICAgICBjb3V0IDw8IGdldEFucygwLCBzLCBuLCAwLCAwKSArIGYgPDwgIlxuIjsKfQpzaWduZWQgbWFpbigpCnsKICAgICAgZmFzdGlvKCkKICAgICAgaW50IHR0ID0gMTsgY2luID4+IHR0OwogICAgICBmb3IgKGludCB0ID0gMTsgdCA8PSB0dDsgdCsrKSB7CiAgICAgICAgICAgIC8vIGNvdXQgPDwgIkNhc2UgIyIgPDwgdCA8PCAiOiAiOwogICAgICAgICAgICBTb2x2ZUNhc2UoKTsKICAgICAgfQogICAgICAvLyBjZXJyIDw8ICJUaW1lIDogIiA8PCAxMDAwICogKCAoZG91YmxlKSBjbG9jaygpICkgLyAoZG91YmxlKSBDTE9DS1NfUEVSX1NFQyA8PCAibXNcbiI7Cn0KCg==