首先注意 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();
}
浙公网安备 33010602011771号