题目链接:http://codeforces.com/problemset/problem/7/D
题意:(1)任何串(包括空串)都是0-回文;
(2)一个长度为n的回文串,若它的前n/2个字符和后n/2个字符都是(k-1)-回文,则它是k-回文。现给定一个串,设它的前缀分别是x-回文,求所有这些x值的和。
比如: abacaba
前缀 x
a 1
ab 0
aba 2
abac 0
abaca 0
abacab 0
abacaba 3
所以输出值 6
用hash就好啦,代码如下:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=5000010;
#define mod 1000000007
#define tmp 137731735
typedef __int64 ll;
char s[maxn];
ll x[maxn], y[maxn];
ll dp[maxn];
int main()
{
ll i;
while(gets(s))
{
dp[0]=0;
for(i=0; s[i]; i++)
{
if(s[i]>='0' && s[i]<='9')
s[i]=s[i]-'0';
else if(s[i]>='a' && s[i]<='z')
s[i]=s[i]-'a'+10;
else s[i]=s[i]-'A'+36;
}
ll len=i;
ll ans=1;
x[0]=0;
for(i=1; i<=len; i++)
{
x[i]=(x[i-1]+s[i-1]*ans)%mod;
ans=(ans*tmp)%mod;
}
y[len+1]=0;
for(i=1; i<=len; i++)
{
y[i]=(y[i-1]*tmp+s[i-1])%mod;
}
ll sum=0;
for(i=1; i<=len; i++)
{
if(x[i]==y[i])
{
dp[i]=dp[i>>1]+1;
sum+=dp[i];
}
}
printf("%I64d\n", sum);
}
return 0;
}