#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
char a[110000],b[221000];
int p[221000];
void pk()
{
int i,mx,id;
mx=id=0;
for(i=1;b[i]!='\0';i++)
{
if(mx>i) //如果满足当前i在mx最大边界内,进入if
{
p[i]=min(p[2*id - i], mx- i); //找到当前I关于id的对称点的p[]值,并在与mx-i取最小值
//if(p[2*id-i]>mx-i) p[i]=mx-i;
//else p[i]=p[2*id-i];
}
else p[i]=1; //当前i不在mx内,则将p[i]=1
while(b[i+p[i]]==b[i-p[i]]) p[i]++; //执行过以上操作后,在当前的范围外逐个判断两边是否还有回文串
if(p[i]+i>mx) //重新找到最大边界
{
mx=p[i]+i;
id=i;
}
}
}
int main()
{
while(scanf("%s",a)!=EOF)
{
int k,i,j,l,m;
memset(p,0,sizeof(p));
l=strlen(a);
k=0;
b[k++]='$'; //预处理为$#a#b#a#b#a的形式
b[k++]='#';
for(i=0;i<l;i++)
{
b[k++]=a[i];
b[k++]='#';
}
b[k]='\0';
j=strlen(b); //前期处理
pk();
m=p[0];
for(i=1;i<j;i++)
{
if(p[i]>m) m=p[i]; //找到最大值
}
printf("%d\n",m-1); //p[i]-1正好等于原来字符串的回文串长度
}
}
最长回文串(manachar算法)模板
最新推荐文章于 2022-11-18 11:38:35 发布