hdu4513_吉哥系列故事――完美队形II_Manacher的数组用法

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

Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)
Total Submission(s): 2879    Accepted Submission(s): 1121


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中的字符型的数组换成整型,分隔符修改下就行了。唯一需要注意的是对题中要求的只能从小到大排列进行一个处理就好。

还有就是可能会直接将str依旧以char形式存下int型的str0原串,这里是错误的做法,因为int型的数如果太大,char型没法存入形成相应的字符,会出错。

代码:

#include 
#include 
#include 
#include 
#include 

using namespace std;
const int MANX = 2e5+100;
int str0[MANX],str[MANX<<1];
int p[MANX<<1],len;
void start()
{
    str[0]=-1,str[1]=-2;
    //len=strlen(str0);
    for(int i=0;ii)p[i]=min(p[2*id-i],mx-i);
        else p[i]=1;
        for(;str[i-p[i]]==str[i+p[i]]&&str[i-p[i]]>=str[i-p[i]];p[i]++);//从小到大排列的处理
        if(p[i]+i>mx)mx=p[i]+i,id=i;
        if(p[i]>ans)ans=p[i];
    }
    printf("%d\n",--ans);
}
void print(){          //查看p数组,可忽略
    for(int i=0;i


想想自己真是蠢死,str已经是处理过的数组了,自己一开始还是进行str[i-p[i]]>=str[i-p[i]+1]进行特判,白白WA了好几次。.T^T.



你可能感兴趣的:(Manacher(马拉车))