// O(n^4)
#include <bits/stdc++.h>
using namespace std;
const int mod = 1e9 + 7;
char ch[60];
int sum[60][60];
int main()
{
int T;
scanf("%d", &T);
while (T--)
{
int len;
scanf("%d", &len);
scanf("%s", ch + 1);
memset(sum, 0, sizeof sum);
for (int i = 1; i <= len; i++)
sum[i][i] = 1;
//以i j 为两端点
for (int l = 1; l <= len; l++) //区间长度
{
for (int i = 1; i <= len; i++) //起点
{
int j = i + l - 1;
if(j > len) continue;
if (ch[i] == ch[j])
{
sum[i][j] = 1;
for (int u = i + 1; u < j; u++) //枚举中间各起终点情况
{
for (int v = u; v < j; v++)
{
sum[i][j] = (sum[i][j] + sum[u][v]) % mod;
}
}
}
//printf("[%d, %d] = %d\n", i, j, sum[i][j]);
}
}
int ans = 0;
for (int i = 1; i <= len; i++) //各起终点回文串数量总和
{
for (int j = i; j <= len; j++)
{
ans = (ans + sum[i][j]) % mod;
}
}
printf("%d\n", ans);
}
return 0;
}
// O(n^2)
#include <bits/stdc++.h>
using namespace std;
const int mod = 1e9 + 7;
char ch[60];
int sum[60][60];
int f[60][60]; //以ij为区间
int main()
{
int T;
scanf("%d", &T);
while (T--)
{
int len;
scanf("%d", &len);
scanf("%s", ch + 1);
memset(sum, 0, sizeof sum);
memset(f, 0, sizeof f);
//以i j 为区间
for (int l = 1; l <= len; l++) //区间长度
{
for (int i = 1; i <= len; i++) //左区间
{
int j = i + l - 1;
if(j > len) continue;
// 方法一.容斥原理 1.sum数组记以ij为端点的回文串数
if (ch[i] == ch[j])
sum[i][j] = (1 + f[i + 1][j - 1]) % mod;
//容斥原理 关系式
f[i][j] = (f[i][j - 1] + f[i + 1][j]) % mod;
f[i][j] = (f[i][j] - f[i + 1][j - 1] + mod) % mod;
f[i][j] = (f[i][j] + sum[i][j]) % mod;
// 方法一.容斥原理 2.sum[i][j]数组用临时变量x代替
int x = 0;
if (ch[i] == ch[j])
x = (1 + f[i + 1][j - 1]) % mod;
f[i][j] = (f[i][j - 1] + f[i + 1][j]) % mod;
f[i][j] = (f[i][j] - f[i + 1][j - 1] + mod) % mod;
f[i][j] = (f[i][j] + x) % mod;
// 方法二.直接递推
f[i][j] = (f[i][j - 1] + f[i + 1][j]) % mod;
f[i][j] = (f[i][j] - f[i + 1][j - 1] + mod) % mod;
if (ch[i] == ch[j])
f[i][j] = (f[i][j] + f[i + 1][j - 1] + 1) % mod;
}
}
printf("%d\n", f[1][len]);
}
return 0;
}
// O(n^2) 递归
#include <bits/stdc++.h>
using namespace std;
const int mod = 1e9 + 7;
int len;
char ch[60];
bool vis[60][60];
int sum[60][60];
int f(int l, int r)
{
if ((l > r) || (l < 1) || (r > len))
return 0;
if (vis[l][r])
return sum[l][r];
vis[l][r] = 1;
if (ch[l] != ch[r])
return sum[l][r] = ((f(l + 1, r) + f(l, r - 1)) % mod - f(l + 1, r - 1) + mod) % mod;
else
return sum[l][r] = (f(l + 1, r) + f(l, r - 1) + 1) % mod;
}
int main()
{
int T;
scanf("%d", &T);
while (T--)
{
memset(vis, 0, sizeof vis);
scanf("%d", &len);
scanf("%s", ch+1);
f(1, len);
printf("%d\n", sum[1][len]);
}
return 0;
}