博主要暴政!啊不是,要学习
马拉车一个for循环的事情。
记录当前最远扩展位置和扩展这个位置的位置(??)。
mx和id。
如果当前i在mx里面,就直接找i与id的对称点,直接得到当前最远扩展长度。然后一个一个扩展。
当然,为了消除奇偶性,字符中间插入rilong字符。这样的扩展长度也恰是回文长度-1.
为了安全,开头再加一个rilong字符。
// luogu-judger-enable-o2
#include<bits/stdc++.h>
using namespace std;
#define in read()
int in{
int cnt=0,f=1;char ch=0;
while(!isdigit(ch)){
ch=getchar();if(ch=='-')f=-1;
}
while(isdigit(ch)){
cnt=cnt*10+ch-48;
ch=getchar();
}
return cnt*f;
}
char s1[12000003],s2[30000003];int tot;
int r[30000003];
void prepare(){
int len=strlen(s1);
s2[++tot]='@';
s2[++tot]='#';
for(int i=0;i<len;i++){
s2[++tot]=s1[i];s2[++tot]='#';
}
}
void manacher(){
int right=0,mid=0;
for(int i=1;i<=tot;i++){
int x;
if(right<=i)x=1;
else x=min(r[mid*2-i],right-i+1);
while(s2[i+x]==s2[i-x])x++;
if(i+x-1>right){
right=i+x-1;
mid=i;
}
//cout<<i<<" "<<x<<endl;
r[i]=x;
}
}
int main(){
scanf("%s",s1);
prepare();
manacher();
int ans=-1;
for(int i=1;i<=tot;i++)ans=max(ans,r[i]-1);
cout<<ans;
return 0;
}