题意:给出一个数字串,询问最长的子串,满足以下要求:将子串平均分为三部分,一三部分相等,一二部分对衬。
/* 在manachar的基础上,枚举回文串的中心,再找第三部分。 */ #include<cstdio> #include<iostream> #define M 200010 using namespace std; int s[M],a[M],p[M],len; void Manancher(){ int l=0; a[l++]=-2; a[l++]=-1; for(int i=0;i<len;i++){ a[l++]=s[i]; a[l++]=-1; } a[l]=-3; int mx=0,id=0; for(int i=0;i<l;i++){ p[i]=mx>i?min(p[2*id-i],mx-i):1; while(a[i+p[i]]==a[i-p[i]])p[i]++; if(i+p[i]>mx){ mx=i+p[i]; id=i; } } } int main(){ int T,tt=0; scanf("%d",&T); while(T--){ scanf("%d",&len); for(int i=0;i<len;i++)scanf("%d",&s[i]); Manancher(); int ans=0; for(int i=1;i<=len*2+1;i+=2){ for(int j=i+p[i]-1;j-i>ans;j-=2){ if(j-i+1<=p[j]){ ans=max(ans,j-i); break; } } } printf("Case #%d: %d ",++tt,ans/2*3); } return 0; }