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; }