//http://bbs.dlut.edu.cn/bbstcon.php?board=Competition&gid=23474 一个奇妙的o(n)算法,明天看看~~
看完结果总结如下:
原串: w aa bwsw f d
新串: # w # a # a # b # w # s # w # f # d #(转载)
辅助数组P: 1 2 1 2 3 2 1 2 1 2 1 4 1 2 1 2 1 2 1
这里有一个很好的性质,P[id]-1就是该回文子串在原串中的长度(包括‘#’)。
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
#define N 320500
char str[N],a[N];
int p[N];
int main ()
{
while(scanf("%s",str)!=EOF)
{
a[0]='$';a[1]='#';
int n=strlen(str);
for(int i=0;i<n;++i)
{
a[2*i+2]=str[i];
a[2*i+3]='#';
}
//memset(p,0,sizeof(p));
n=2*n+2;
int mx=1,id=0,ans=0;
for(int i=0;i<n;++i)
{
if(mx>i)
p[i]=min(p[2*id-i],mx-i);
else p[i]=1;
while(a[i-p[i]]==a[i+p[i]]) p[i]++;
if(i+p[i]>mx)
{
id=i;
mx=i+p[i];
}
ans=max(ans,p[i]);
}
printf("%d\n",ans-1);
}
return 0;
}