ABC398 F,一定要注意s最后和前面放的东西不一样,血泪教训
#include<bits/stdc++.h>
using namespace std;
using ll = long long;
using ull = unsigned long long;
using pii = pair<int,int>;
using db = double;
#define int long long
const int N=1e7+1e6+10;
int n,P[N<<1];
char a[N],s[N<<1];
void change(){
n=strlen(a);
// cout<<n<<endl;
int k=0;
s[k++]='$';//
s[k++]='#';
for(int i=0;i<n;i++){
s[k++]=a[i];
s[k++]='#';
}
s[k++]='&';//注意这个地方和第一个地方放的东西要不一样,不然如:aaaa会出现非常奇怪的大数
n=k;
}
void manacher(){
int R=0,C;
for(int i=1;i<n;i++){
if(i<R) P[i]=min(P[(C<<1)-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;
}
}
}
signed main(){
// std::ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);
scanf("%s",a);
change();
manacher();
int ans=1;
for(int i=0;i<n;i++) {
ans=max(ans,P[i]);
}
ans--;
cout<<ans<<endl;
// for(int i=0;i<n;i++){
// cout<<s[i]<<" "<<P[i]<<"\n";
// }
return 0;
}