Manacher算法详解
https://blog.csdn.net/dyx404514/article/details/42061017
求最长回文串长度,manacher算法模板题。
#include<bits/stdc++.h>
using namespace std;
const int N=1000010;
char str[N],tmp[N<<1];
int len[N<<1],l;
int init()
{
int i;
tmp[0]='@';
for(i=1;i<=2*l;i+=2)
{
tmp[i]='#';
tmp[i+1]=str[i/2];
}
tmp[2*l+1]='#';
tmp[2*l+2]='$';
//tmp[2*l+3]=0;
return 2*l+1;
}
int manacher()
{
int mx=0,ans=0,po=0,i;
//以po为中心的最长回文串,mx为当前计算回文串最右边字符的最大值
for(i=1;i<=l*2;i++)
{
if(mx>i)
len[i]=min(len[2*po-i],mx-i);
else
len[i]=1;
while(tmp[i-len[i]]==tmp[i+len[i]])
len[i]++;
if(len[i]+i>mx)
{
mx=len[i]+i;
po=i;
}
ans=max(ans,len[i]);
}
return ans-1;
}
int main()
{
int cas=1;
while(1)
{
scanf("%s",str);
getchar();
if(str[0]=='E')
break;
l=strlen(str);
init();
printf("Case %d: %d\n",cas++,manacher());
}
return 0;
}