HDUOJ 4513 吉哥系列故事——完美队形II
HDUOJ 4513 吉哥系列故事——完美隊形II
Problem Description
吉哥又想出了一個新的完美隊形游戲!
假設有n個人按順序站在他的面前,他們的身高分別是h[1], h[2] … h[n],吉哥希望從中挑出一些人,讓這些人形成一個新的隊形,新的隊形若滿足以下三點要求,則就是新的完美隊形:
1、挑出的人保持原隊形的相對順序不變,且必須都是在原隊形中連續的;
2、左右對稱,假設有m個人形成新的隊形,則第1個人和第m個人身高相同,第2個人和第m-1個人身高相同,依此類推,當然如果m是奇數,中間那個人可以任意;
3、從左到中間那個人,身高需保證不下降,如果用H表示新隊形的高度,則H[1] <= H[2] <= H[3] … <= H[mid]。
現在吉哥想知道:最多能選出多少人組成新的完美隊形呢?
Input
輸入數據第一行包含一個整數T,表示總共有T組測試數據(T <= 20);
每組數據首先是一個整數n(1 <= n <= 100000),表示原先隊形的人數,接下來一行輸入n個整數,表示原隊形從左到右站的人的身高(50 <= h <= 250,不排除特別矮小和高大的)。
Output
請輸出能組成完美隊形的最多人數,每組輸出占一行。
Sample Input
2 3 51 52 51 4 51 52 52 51Sample Output
3 4Manacher模改題,因為每個數字中間插入了一個0,所以只需在判斷回文數時加一個 s [ i ? l [ i ] ] < = s [ i ? l [ i ] + 2 ] s[i-l[i]]<=s[i-l[i]+2] s[i?l[i]]<=s[i?l[i]+2] 的條件即可,AC代碼如下:
#include<bits/stdc++.h> using namespace std; const int N=2e5+5; int p[N],s[N<<1],l[N<<1];int change(int *p,int n){int i;s[0]=-1;//防越界for(int i=1;i<=2*n;i+=2){s[i]=0;s[i+1]=p[i>>1];}s[2*n+1]=0;s[2*n+2]=-2;//防越界return 2*n+1; }int manacher(int *s,int len){int mx=0,ans=0,pos=0;for(int i=1;i<=len;i++){if(mx>i) l[i]=min(mx-i,l[2*pos-i]);else l[i]=1;while(s[i-l[i]]==s[i+l[i]] && s[i-l[i]]<=s[i-l[i]+2]) l[i]++;if(l[i]+i>mx){mx=l[i]+i;pos=i;}ans=max(ans,l[i]);}return ans-1; }int main(){int T,n;scanf("%d",&T);while(T--){scanf("%d",&n);for(int i=0;i<n;i++)scanf("%d",&p[i]);int len=change(p,n);printf("%d\n",manacher(s,len));} }總結
以上是生活随笔為你收集整理的HDUOJ 4513 吉哥系列故事——完美队形II的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 中国节水灌溉设备产业运行分析与投资前景规
- 下一篇: 2.4 zio入门——ZIO类型参数