参考 P4555,求出 li,ri,注意要要求 li,ri 均为偶数,并且不一定强制要两个回文串,可以只有单个回文串。
//洛谷 P3546
//https://www.luogu.com.cn/problem/P3546
#include<bits/stdc++.h>
#define LL long long
#define fr(x) freopen(#x".in","r",stdin);freopen(#x".out","w",stdout);
using namespace std;
const int N=2e6+15;
int n,mid,mr,a[N],l[N],r[N],mx;
char c[N],d[N],C[N];
int main()
{
scanf("%d%s",&n,d);
for(int i=0,j=0;j<n;i++,j+=2) C[j]=d[i];
for(int i=n-1,j=1;j<n;i--,j+=2) C[j]=d[i];
c[0]='/';c[1]='@';for(int i=1;i<=n;i++) c[i<<1]=C[i-1],c[i<<1|1]='@';n=n<<1|1;mid=mr=1;
for(int i=2;i<=n;i++)
{
if(mid<=i&&i<=mr) a[i]=min(a[2*mid-i],mr-i);
while(c[i+a[i]+1]==c[i-a[i]-1]) a[i]++;
if(i+a[i]>mr) mr=i+a[i],mid=i;
if(a[i]&1) continue;
l[i+a[i]]=max(l[i+a[i]],a[i]);
r[i-a[i]]=max(r[i-a[i]],a[i]);
}
for(int i=3;i<=n;i+=2) r[i]=max(r[i],r[i-2]-2);
for(int i=n-2;i>=1;i-=2) l[i]=max(l[i],l[i+2]-2);int ans=0;
for(int i=3;i<=n;i+=2) if(i==2*l[i]+1) ans=max(ans,l[i]+r[i]);
return cout<<ans/2,0;
}