您的位置:首页 > 其它

poj 3974 Palindrome 裸的最长回文子串Mancher算法O(n)

2015-10-16 13:46 309 查看
//poj 3974
//sep9
#include <iostream>
using namespace std;
const int MAXN=1000024;
char a[MAXN],b[2*MAXN];
int p[2*MAXN];
int main()
{
int cases=0;
while(scanf("%s",a)==1&&a[0]!='E'){
int i=0,j=0;
b[j++]='X';
b[j++]='#';
while(a[i]!='\0'){
b[j++]=a[i++];
b[j++]='#';
}
memset(p,0,sizeof(p));
int len=j,ids=0,mx=0;
for(int i=1;i<len;++i){
if(mx>i)
p[i]=(p[2*ids-i]<(mx-i)?p[2*ids-i]:mx-i);
else
p[i]=1;
while(b[i-p[i]]==b[i+p[i]])
++p[i];
if(i+p[i]>mx){
mx=i+p[i];
ids=i;
}
}
int maxx=0;
for(int i=1;i<len;++i)
maxx=max(maxx,p[i]-1);
printf("Case %d: %d\n",++cases,maxx);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  poj 算法