首先注意 2* n 的长度
mx: 当前匹配到的最大长度 即 [1,mx]
id: mx 对应的中心点
pi : s[i] 为中心的回文串的最大长度, pi /2 -1 是半径()
#include <iostream> #include <cstring> #include <algorithm> using namespace std; const int N=2.3*1E7; char s[N]; char ss[N]; int n,len,p[N]; void manacher(){ int i,mid=0,mr=0; for(i=2;i<len;i++){ if(i<=mr) p[i]=min(p[mid*2-i],mr-i+1); else p[i]=1; while(ss[i-p[i]]==ss[i+p[i]]) p[i]++; if(i+p[i]>mr) mr=i+p[i]-1,mid=i; } int ans=0; for(int i=1;i<=n;i++) ans=max(ans,p[i]) ; cout<<ans-1<<endl; } signed main(){ cin>>(s+1); n=strlen(s+1); ss[++len]='!',ss[++len]='#'; for(int i=1;i<=n;i++) ss[++len]=s[i],ss[++len]='#'; //ss[++len]='?'; manacher(); }
标签:记录,int,manacher,len,ss,include,mx From: https://www.cnblogs.com/towboa/p/17517853.html