Hotaru's problem(hdu 5371)

题意:给出一个数字串,询问最长的子串,满足以下要求:将子串平均分为三部分,一三部分相等,一二部分对衬。

/*
  在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\n",++tt,ans/2*3);
    }
    return 0;
}

 

posted @ 2017-01-04 15:40  karles~  阅读(216)  评论(0编辑  收藏  举报