- gf25036 的博客
《章鱼博客 & C++》大蘑菇模子
- @ 2026-9-13 19:48:58

O(n)
#include<bits/stdc++.h>
using namespace std;
const int N=22000005;
string a;
char s[N*2];
int p[N*2],n,ans=1;
void yu(){
n=a.size();
int k=0;
s[k++]='$';
s[k++]='#';
for(int i=0;i<n;i++){
s[k++]=a[i];
s[k++]='#';
}
s[k++]='&';
n=k;
int R=0,c;
for(int i=1;i<n;i++){
if(i<R){
p[i]=min(p[c*2-i],p[c]+c-i);
}else{
p[i]=1;
}
while(s[i+p[i]]==s[i-p[i]]){
p[i]++;
}
if(p[i]+i>R){
R=p[i]+i;
c=i;
}
}
for(int i=0;i<n;i++){
ans=max(ans,p[i]-1);
}
cout<<ans;
}
int main(){
cin>>a;
yu();
return 0;
}