hdu 4513

http://acm.hdu.edu.cn/showproblem.php?pid=4513

和这个题很像,YY一下就可以了http://www.cnblogs.com/aigoruan/archive/2012/07/08/2581217.html

思路:二分+暴力匹配

View Code
#include<set>
#include<map>
#include<stack>
#include<queue>
#include<cmath>
#include<bitset>
#include<string>
#include<climits>
#include<cstdio>
#include<vector>
#include<utility>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;

const int maxn = 100005;

int max(int x,int y){return x>y?x:y;}

int as[maxn],L,flag;
int bs[maxn],cs[maxn],ds[maxn];

int judge(int g)
{
    int i,k = 0;

    for(i = g; i + g <= L; ++ i)
    {
        if(cs[i]>=g && ds[i]>=g){
            if(as[i] - as[i-g] == as[i+g+1] - as[i+1]){
                k = g;
                int s = i - 1;
                int t = i + 1;
                while(k){
                    if(bs[s] ^ bs[t])break;
                    s--; t++;
                    k--;
                }
                if(!k){flag = 1; return 1;}
            }
        }
    }
    for(i = g; i + g <= L; ++ i)
        if(cs[i-1]>=g-1 && ds[i]>=g-1){
            if(as[i]-as[i-g]==as[i+g]-as[i]){
                k = g;
                int s = i;
                int t = i;
                while(k){
                    if(bs[s-1] ^ bs[t])break;
                    s--; t++;
                    k--;
                }
                if(!k){flag = 0; return 1;}
            }
    }
    return 0;
    
}

int main()
{
    int i,low,high,mid,ans;
    int cas,n;
    scanf("%d",&cas);
    while(cas--){
        scanf("%d",&n);
        L = n;
        for(i = 0; i < n; ++ i)scanf("%d",bs+i);bs[n]=0;
        as[1] = bs[0];
        for(i = 1; i < L; ++ i) as[i+1] = as[i] + bs[i];
        as[L+1]=0;
        cs[0]=0;
        for(i = 1; i < n; ++ i)
            if(bs[i]>=bs[i-1])cs[i] = cs[i-1] + 1;
            else cs[i] = 0;
        ds[n-1] = 0;
        for(i=n-2;i>=0;--i)
            if(bs[i]>=bs[i+1])ds[i]=ds[i+1]+1;
            else ds[i]=0;

        low = 1; high = L / 2; ans = 1;
        while(low<=high){
            mid = (low + high) >> 1;
            if(judge(mid)){
                ans = max(ans,mid * 2 + flag);
                low = mid + 1;
            }else high = mid - 1;
        }
        printf("%d\n",ans);
    }
    return 0;
}

 

posted on 2013-03-22 23:48  aigoruan  阅读(436)  评论(0编辑  收藏  举报

导航