虽然是暴力,但#3答案一直不对,不知道正确性哪里有误。
/*
前之君待,湿露月九。
问有我无,谁为方彼。
*/
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define ld long double
#define lb(x) (x&-x)
const int maxn=10000010;
const int mo=1000000007;
const int inf=0x3f3f3f3f3f3f3f3f;
inline int read(){
int x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-')
f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9'){
x=(x<<1)+(x<<3)+(ch^48);
ch=getchar();
}
return x*f;
}
void write(int x){
if(x<0)
x=-x;
if(x>9)
write(x/10);
putchar(x%10+'0');
return ;
}
int n,h[maxn],ans;
char s[maxn];
signed main(){
// freopen("sjj.out","r",stdin);
// freopen("sb.out","w",stdout);
read();
char ch=getchar();
while(ch<'a'||ch>'z')
ch=getchar();
while(ch>='a'&&ch<='z'){
s[++n]=ch;
s[++n]='|';
ch=getchar();
}
s[0]='|';
int l,r=0,mid=0;
for(int i=1;i<=n;i++){
if(i<r){
h[i]=min(h[(mid<<1)-i],r-i+1);
if(h[i]==r-i+1){
for(int j=h[i]+1;i+j-1<=n&&i-j+1>=0;j++){
if(s[i+j-1]!=s[i-j+1])
break;
h[i]=j;
}
}
}
else
for(int j=1;i+j-1<=n&&i-j+1>=0;j++){
if(s[i+j-1]!=s[i-j+1])
break;
h[i]=j;
}
if(i+h[i]-1>r){
r=i+h[i]-1;
mid=i;
}
}
for(int i=2;i<=n;i+=2){
int ccc=h[i];
ccc--;
if(ccc%4!=0)
ccc-=2;
for(int len=ccc;len>=0;len-=4){
int m1=i-(len>>1);
if(h[m1]==((len>>1)+1))
ans=max(ans,len);
}
}
printf("%lld\n",ans);
return 0;
}