HDU 4513 吉哥系列故事――完美队形II(Manacher)
2016-02-19 12:55
411 查看
题目链接:[kuangbin带你飞]专题十六 KMP & 扩展KMP & Manacher V - 吉哥系列故事――完美队形II
假设有n个人按顺序站在他的面前,他们的身高分别是h[1], h[2] … h
,吉哥希望从中挑出一些人,让这些人形成一个新的队形,新的队形若满足以下三点要求,则就是新的完美队形:
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
,吉哥希望从中挑出一些人,让这些人形成一个新的队形,新的队形若满足以下三点要求,则就是新的完美队形:
1、挑出的人保持原队形的相对顺序不变,且必须都是在原队形中连续的;
2、左右对称,假设有m个人形成新的队形,则第1个人和第m个人身高相同,第2个人和第m-1个人身高相同,依此类推,当然如果m是奇数,中间那个人可以任意;
3、从左到中间那个人,身高需保证不下降,如果用H表示新队形的高度,则H[1] <= H[2] <= H[3] …. <= H[mid]。
现在吉哥想知道:最多能选出多少人组成新的完美队形呢?
思路
跟HDU 3068 最长回文(Manacher)差不多,也是求回文串长度,区别就是多了一个非递减的约束条件,加上判断即可。代码
[code]#include <iostream> #include <algorithm> #include <cstring> #include <cstdio> #include <cstdlib> #include <vector> using namespace std; const int N = 100009; int s[N*2], p[N*2]; int manacher(int len) { int mx = 0, id = 0, ans = 1; p[0] = 0; for(int i=1; i<len; i++) { p[i] = 1; if(mx > i) p[i] = min(mx-i, p[2*id-i]); while(s[i-p[i]] == s[i+p[i]] && s[i-p[i]] <= s[i-p[i]+2]) p[i]++; if(i+p[i] > mx) mx = i+p[i], id = i; if(ans < p[i]-1) ans = p[i]-1; } return ans; } int main() { int T; scanf("%d", &T); while(T--) { int n; scanf("%d", &n); s[0] = -1; for(int i=1; i<=n; i++) { s[i*2-1] = 0; scanf("%d", &s[i*2]); } s[2*n+1] = 0; printf("%d\n", manacher(2*n+1)); } return 0; }
相关文章推荐
- 分析fork后多进程对文件的共享
- 基于openssl的https服务配置
- Java 入门 之 Socket 与 聊天室项目基础知识
- 如何确定DM9000网卡的地址
- 经常使用算法之贪心
- 多进程共享文件
- vector容器与iterator迭代器
- Git常用命令备忘
- IOS中 Block简介与用法
- HDU 1950 Bridging signals (LIS)
- 面向对象知识二
- HDU 1523 Decoding Morse Sequences(DP)
- windows 显示smb分享成功,其他电脑却无法读取该分享原因
- CentOS 6.7下php5+安装redis扩展组件
- MPEG-7描述子(0)——颜色空间
- 【SPOJ-KNJIGE】KNJIGE【思维】【贪心?】
- web旋转式
- js || 运算符 config = config || {};
- PL/SQL教程之八:触发器
- java.util.LinkedHashMap cannot be cast to