题目:http://acm.hdu.edu.cn/showproblem.php?pid=3068
思路:直接套用manacher算法。
manacher算法是用于计算一个字符串中最长回文子串的长度。
资料来源网络:http://www.felix021.com/blog/read.php?2040
#include<stdio.h>
#include<string.h>
#define min(a,b) a<b?a:b
char str[220005],s[220005],x[10];
int len,p[220005];
void solve()
{
int i,mx,id;
mx=0;
for(i=1;i<len;i++)
{
if(mx>i){
p[i]=min(p[2*id-i],p[id]+id-i);
}
else p[i]=1;
for(;str[p[i]+i]==str[i-p[i]];p[i]++)
;
if(p[i]+i>mx){
mx=p[i]+i;
id=i;
}
}
}
void init()
{
str[0]='$';str[1]='#';
for(int i=0;i<len;i++)
{
str[i*2+2]=s[i];
str[i*2+3]='#';
}
len=len*2+2;
str[len]='#';
}
int main()
{
int i,j,k;
while(scanf("%s",s)!=EOF)
{
len=strlen(s);
init();
solve();
int ans=0;
for(i=1;i<len;i++)
{
if(p[i]>ans)ans=p[i];
}
printf("%d\n",ans-1);
}
return 0;
}