您的位置:首页 > 其它

poj 3974 Palindrome

2013-04-24 12:40 176 查看


最长回文子串模板 (Manacher算法,时间复杂度O(n))

#include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int MAX=1000005;
int p[MAX<<1],len;
char s[ MAX],str[MAX<<1];
inline int min(int a,int b)
{
return a<b?a:b;
}
void pk()
{
int i;
int mx=0;
int id;

for(i=1;i<len;i++)
{
if(mx>i)
{
p[i]=min(p[2*id-i],mx-i);
}
else
p[i]=1;

while (str[i+p[i]] == str[i-p[i]]) p[i]++;
if(p[i]+i>mx)
{
mx=p[i]+i;
id=i;
}

}

}
int main()
{
int i,max,cont=1;
while(scanf("%s",s)!=EOF,strcmp(s,"END"))
{

len=strlen(s);
str[0]='$';str[1]='#';
for(i=0;i<len;i++)
{
str[(i<<1)+2]=s[i];
str[(i<<1)+3]='#';
}
len=(len<<1)+2;
str[len]='\0';
//cout<<str<<endl;
pk();
max=0;
for(i=0;i<len;i++)
{
if(p[i]>max)
max=p[i];
}
printf("Case %d: %d\n",cont++,max-1);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: