日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

HDUOJ 4513 吉哥系列故事——完美队形II

發布時間:2024/3/13 编程问答 56 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 51

Sample Output

3 4

Manacher模改題,因為每個數字中間插入了一個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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。