http://codeforces.com/blog/entry/19193
不是很懂证明
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const int N=1000010,P=1e9+7;
int n,t,cnt,p;
char a[N];
int b[N],f[N],g[N];
int len[N],fail[N],dfail[N],diff[N],nxt[N][26];
inline void extend(int x){
while(b[x]!=b[x-len[p]-1]) p=fail[p];
if(!nxt[p][b[x]]){
int cur=++cnt,k=fail[p]; len[cur]=len[p]+2;
while(b[x]!=b[x-len[k]-1]) k=fail[k];
fail[cur]=nxt[k][b[x]];
nxt[p][b[x]]=cur;
diff[cur]=len[cur]-len[fail[cur]];
if(diff[cur]==diff[fail[cur]])
dfail[cur]=dfail[fail[cur]];
else
dfail[cur]=fail[cur];
}
p=nxt[p][b[x]];
}
int pos[N];
int main(){
scanf("%s",a+1); n=strlen(a+1);
if(n&1) return puts("0"),0;
int l=n>>1,r=l+1; b[0]=-1;
for(int i=1;i<=(n>>1);i++)
b[++t]=a[l--]-'a',b[++t]=a[r++]-'a';
cnt=1; fail[0]=fail[1]=1; diff[0]=1; len[1]=-1; f[0]=1;
for(int i=1;i<=n;i++){
extend(i);
for(int np=p;np;np=dfail[np]){
g[np]=f[i-(len[dfail[np]]+diff[np])];
if(diff[np]==diff[fail[np]])
g[np]=(g[np]+g[fail[np]])%P;
f[i]=(f[i]+g[np])%P;
}
if(i&1) f[i]=0;
}
printf("%d\n",f[n]);
return 0;
}