预处理
处理满足AA形式的字串
记录在i这个位置
以它为开头的AA形式和以它为结尾的AA形式的字串的个数
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
#include<cmath>
#include<queue>
#include<vector>
#include<climits>
#include<string>
#include<cstdlib>
#include<ctime>
#define ULL unsigned long long
#define LL long long
#define MOD1 1000000007
#define MOD2 23333333333
#define base 131
using namespace std;
char s[2005];
int T,f1[2005][2005],f2[2005][2005],len,mid,ans,f[2005],g[2005];
void pre()
{
int i,j;
memset(f1,0,sizeof(f1));
memset(f2,0,sizeof(f2));
for(i=1;i<=len;i++)
for(j=i;j<=len;j++)
{
f1[i][j]=(f1[i][j-1]*base+s[j]-'a'+1)%MOD1;
f2[i][j]=(f2[i][j-1]*base+s[j]-'a'+1)%MOD2;
}
}
int main()
{
int i,j;
scanf("%d",&T);
while(T--)
{
scanf("%s",s);
len=strlen(s);
for(i=len;i>=1;i--)
s[i]=s[i-1];
s[0]=0;
ans=0;
memset(f,0,sizeof(f));
memset(g,0,sizeof(g));
pre();
for(i=1;i<=len;i++)
for(j=i+1;j<=len;j++)
if((j-i+1)%2==0)
{
mid=(i+j)>>1;
if((f1[mid+1][j]==f1[i][mid])&&(f2[mid+1][j]==f2[i][mid]))
{
f[i]++;
g[j]++;
}
}
for(i=1;i<=len;i++)
if(f[i+1]&&g[i]) ans+=f[i+1]*g[i];
printf("%d\n",ans);
}
return 0;
}219