#include <iostream>
#include <cstring>
using namespace std;
#define MIN(a,b) ((a)<(b)?(a):(b))
const int MAX = 1000010;
char str[MAX],newstr[2*MAX];
int len,p[2*MAX];//p[]数组保存的是以每个字符为中心的最长回文子串的半径
void change()//构造奇数字符串
{
int i;
len = strlen(str);
newstr[0]='#';
for(i=0;i<len;i++)
{
newstr[2*i+1]=str[i];
newstr[2*i+2]='#';
}
len = 2*len+1;
newstr[len]='\0';
}
void pk()
{
int i,id,maxid=0,ans=1;//maxid为最右边边界
for(i=0;i<len;i++)
{
if(maxid>i)
{
p[i]=MIN(p[2*id-1],maxid-i);
}
else
{
p[i]=1;
}
while((newstr[i+p[i]]==newstr[i-p[i]]) && (i-p[i]>=0) && (i+p[i]<=len))
p[i]++;
if(p[i]+i>maxid)
{
maxid=p[i]+i;
id=i;
}
if(ans<p[i])
ans=p[i];
}
cout<<ans-1<<endl;
}
int main()
{
int N;
cin>>N;
while(N--)
{
cin>>str;
change();
pk();
}
return 0;
}
参考:http://blog.csdn.net/yzl_rex/article/details/7908259
不过亲测,超时啊。。。