hdu4513_吉哥系列故事――完美队形II_Manacher的数组用法
来源:互联网 发布:大型系统网络拓扑图 编辑:程序博客网 时间:2024/06/06 02:00
吉哥系列故事——完美队形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]。
现在吉哥想知道:最多能选出多少人组成新的完美队形呢?
假设有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,不排除特别矮小和高大的)。
每组数据首先是一个整数n(1 <= n <= 100000),表示原先队形的人数,接下来一行输入n个整数,表示原队形从左到右站的人的身高(50 <= h <= 250,不排除特别矮小和高大的)。
Output
请输出能组成完美队形的最多人数,每组输出占一行。
Sample Input
2351 52 51451 52 52 51
Sample Output
34
解:额貌似也没什么好说的,将Manacher中的字符型的数组换成整型,分隔符修改下就行了。唯一需要注意的是对题中要求的只能从小到大排列进行一个处理就好。
还有就是可能会直接将str依旧以char形式存下int型的str0原串,这里是错误的做法,因为int型的数如果太大,char型没法存入形成相应的字符,会出错。
代码:
#include <iostream>#include <cstdio>#include <cstdlib>#include <cstring>#include <algorithm>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;i<len;i++) { str[i*2+2]=str0[i]; str[i*2+3]=-2; } str[len*2+2]=-6;}void solve(){ memset(p,0,sizeof(p)); int mx=0,id,ans=1; for(int i=1;i<len*2+2;++i) { if(mx>i)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<len*2+2;i++) cout<<p[i]<<" "; cout<<endl;}int main(){ int t; scanf("%d",&t); while(t--) { memset(str,0,sizeof(str)); memset(str0,0,sizeof(str0)); scanf("%d",&len); for(int i=0;i<len;i++) scanf("%d",&str0[i]); start(); solve(); //print(); } return 0;}
想想自己真是蠢死,str已经是处理过的数组了,自己一开始还是进行str[i-p[i]]>=str[i-p[i]+1]进行特判,白白WA了好几次。.T^T.
0 0
- hdu4513_吉哥系列故事――完美队形II_Manacher的数组用法
- hdu4513_吉哥系列故事——完美队形II
- hdu 4513 吉哥系列故事——完美队形II_Manacher算法
- 求数组的最长递增子序列VS吉哥系列故事——完美队形
- hdu 4513 吉哥系列故事――完美队形II (Manacher)
- HDU - 4512吉哥系列故事――完美队形I最大上升公共子序列
- HDU - 4513 吉哥系列故事――完美队形II(manacher)
- 大二训练第一周 B - 吉哥系列故事――完美队形II manacher
- HDU---4513-吉哥系列故事――完美队形II (manacher)
- HDU 4513 吉哥系列故事――完美队形II(Manacher)
- HDU 4513吉哥系列故事――完美队形II
- HDU 4513 吉哥系列故事――完美队形II
- HDU 3613 吉哥系列故事――完美队形II(Manacher模板稍加改动)
- HDU 4513 吉哥系列故事――完美队形II(Manacher算法)
- HDU 4513 吉哥系列故事――完美队形II(manacher)
- 吉哥系列故事——完美队形
- 吉哥系列故事——完美队形
- hdu4512 吉哥系列故事——完美队形I
- React-bootstrap 中文文档
- 数据结构(2):栈和队列
- BUAA 1033 (三分枚举计算 点到线段的最短距离)
- Python日期加减运算
- HashMap的工作原理
- hdu4513_吉哥系列故事――完美队形II_Manacher的数组用法
- find函数用法详解
- Java 多线程(九)——ThreadLocal类
- HashMap和HashSet的区别
- POJ3615
- Hdu 1846 Brave Game 巴什博奕
- Java并发编程实战
- 基于QT的学生信息管理系统开发
- mysql安装