#include<iostream>
using namespace std;
#define N 110001
char s[N],str[N*2];
int p[N*2],len;
int max(int a,int b) {return a>b?a:b;}
int min(int a,int b) {return a<b?a:b;}
void Manacher()
{
int i,mx,id; //这里定义的mx,id与下图中的意思一样
len=len*2+2;
mx=0;
for(i=1;i<len;i++) //Manacher算法从这里开始
{
if(mx>i)
p[i]=min(p[id*2-i],mx-i);
else p[i]=1;
for(;str[i-p[i]]==str[i+p[i]];p[i]++)
;
if(i+p[i]>mx)
{
mx=i+p[i];
id=i;
}
} //结束
}
int main()
{
int i;
while(scanf("%s",s)>0)
{
len=strlen(s);
str[0]='$';
str[1]='#';
for(i=0;i<len;i++)
{
str[i*2+2]=s[i];
str[i*2+3]='#';
}
str[i*2+2]='\0';
Manacher();
int ans=-1;
for(i=1;i<len;i++)
ans=max(ans,p[i]);
printf("%d\n",ans-1);
}
return 0;
}
hdu3068 Manacher算法
最新推荐文章于 2021-04-06 11:55:28 发布