同第一篇题解但不用并查集的做法
查看原帖
同第一篇题解但不用并查集的做法
365021
masterhuang楼主2024/9/4 10:55

参考 P4555,求出 li,ril_i,r_i,注意要要求 li,ril_i,r_i 均为偶数,并且不一定强制要两个回文串,可以只有单个回文串。

//洛谷 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;
}
2024/9/4 10:55
加载中...