求字串中最長迴文串的長度 manacher演算法 模板
阿新 • • 發佈:2018-11-27
https://www.luogu.org/problemnew/show/P3805
#include<bits/stdc++.h>
using namespace std;
const int maxn=11000002;
char S[maxn<<1];
int hw[maxn<<1];
int cnt=1,maxans=1;
inline void read()
{
char ch=getchar();
S[0]='~',S[1]='|';
while(ch<'a'||ch>'z') ch=getchar();
while (ch>='a'&&ch<='z')
{
S[++cnt]=ch,S[++cnt]='|';
ch=getchar();
}
return;
}
void manacher()
{
int maxright=0,mid=0;
for (int i=1,edd=cnt;i<=edd;++i)
{
if(i<maxright)
hw[i]=min(hw[(mid<<1)-i],maxright-i);
else
hw[ i]=1;
while(S[i-hw[i]]==S[i+hw[i]])
//暴力拓展左右兩側,當i-p[i]==0時,由於S[0]是'~',自動停止。
//故不會下標溢位。
hw[i]++;
if(hw[i]+i>maxright)
//更新mid和maxright,保持maxright是最右的才能保證我們提前確定的部分迴文半徑儘量多。
maxright=hw[i]+i,mid=i;
if(hw[i]>maxans)
maxans= hw[i];
}
}
int main()
{
read();
manacher();
printf("%d\n",maxans-1);
return 0;
}