HDUOJ 4513 吉哥系列故事——完美队形II
HDUOJ 4513 吉哥系列故事——完美隊(duì)形II
Problem Description
吉哥又想出了一個(gè)新的完美隊(duì)形游戲!
假設(shè)有n個(gè)人按順序站在他的面前,他們的身高分別是h[1], h[2] … h[n],吉哥希望從中挑出一些人,讓這些人形成一個(gè)新的隊(duì)形,新的隊(duì)形若滿足以下三點(diǎn)要求,則就是新的完美隊(duì)形:
1、挑出的人保持原隊(duì)形的相對順序不變,且必須都是在原隊(duì)形中連續(xù)的;
2、左右對稱,假設(shè)有m個(gè)人形成新的隊(duì)形,則第1個(gè)人和第m個(gè)人身高相同,第2個(gè)人和第m-1個(gè)人身高相同,依此類推,當(dāng)然如果m是奇數(shù),中間那個(gè)人可以任意;
3、從左到中間那個(gè)人,身高需保證不下降,如果用H表示新隊(duì)形的高度,則H[1] <= H[2] <= H[3] … <= H[mid]。
現(xiàn)在吉哥想知道:最多能選出多少人組成新的完美隊(duì)形呢?
Input
輸入數(shù)據(jù)第一行包含一個(gè)整數(shù)T,表示總共有T組測試數(shù)據(jù)(T <= 20);
每組數(shù)據(jù)首先是一個(gè)整數(shù)n(1 <= n <= 100000),表示原先隊(duì)形的人數(shù),接下來一行輸入n個(gè)整數(shù),表示原隊(duì)形從左到右站的人的身高(50 <= h <= 250,不排除特別矮小和高大的)。
Output
請輸出能組成完美隊(duì)形的最多人數(shù),每組輸出占一行。
Sample Input
2 3 51 52 51 4 51 52 52 51Sample Output
3 4Manacher模改題,因?yàn)槊總€(gè)數(shù)字中間插入了一個(gè)0,所以只需在判斷回文數(shù)時(shí)加一個(gè) 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));} }總結(jié)
以上是生活随笔為你收集整理的HDUOJ 4513 吉哥系列故事——完美队形II的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 中国节水灌溉设备产业运行分析与投资前景规
- 下一篇: 2.4 zio入门——ZIO类型参数