1. 程式人生 > >求字串中最長迴文串的長度 manacher演算法 模板

求字串中最長迴文串的長度 manacher演算法 模板

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; }