HDU4513 【mannacher算法】
题目链接http://acm.hdu.edu.cn/showproblem.php?pid=4513
假设有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]。
现在吉哥想知道:最多能选出多少人组成新的完美队形呢?
20);
每组数据首先是一个整数n(1 <= n <=
100000),表示原先队形的人数,接下来一行输入n个整数,表示原队形从左到右站的人的身高(50 <= h <=
250,不排除特别矮小和高大的)。
#include<stdio.h>
#include<algorithm>
#include<string.h>
#define mem(a, b) memset(a, b, sizeof(a))
using namespace std;
const int MAXN = 1e5 + ;
const int inf = 0x3f3f3f3f; int n;
int a[MAXN], s[ * MAXN], len, p[ * MAXN]; void get_s() //为了避免因 奇数偶数长度的串 引起的讨论,直接构造新的数列
{
s[] = -inf;
s[] = -;
len = ;
for(int i = ; i <= n; i ++)
{
s[++ len] = a[i];
s[++ len] = -;
}
s[++ len] = inf; //防止越界 s[0] 与 s[len]必须不相同
} int mannacher()
{
int mx = , id = , maxlen = -;
mem(p, ); //每个点的最长回文半径初始化为 0
for(int i = ; i < len; i ++) //除去了边界
{
if(i < mx)//先获取该点的回文半径当前最长长度 待更新
p[i] = min(p[id - (i - id)], mx - i);
else
p[i] = ;
while(s[i - p[i]] == s[i + p[i]] && s[i - p[i]] <= s[i - p[i] + ]) //限制条件
p[i] ++;
if(i + p[i] > mx)
{
mx = i + p[i];
id = i;
}
maxlen = max(maxlen, p[i] - );
}
return maxlen;
} int main()
{
int T;
scanf("%d", &T);
while(T --)
{
scanf("%d", &n);
len = ;
for(int i = ; i <= n; i ++)
scanf("%d", &a[i]);
get_s();
int ans = mannacher();
printf("%d\n", ans);
}
return ;
}
mannacher
HDU4513 【mannacher算法】的更多相关文章
- 马拉车算法,mannacher查找最长回文子串
作用: 在线性时间内找到一个字符串的最大回文子串 原理: 奇偶变换:为处理字符串方便,现将给定的任意字符串进行处理,使所有可能的奇数/偶数长度的回文子串都转换成了奇数长度. 具体就是在每个字符的两边都 ...
- HDU4513 吉哥系列故事——完美队形II Manacher算法
题目链接:https://vjudge.net/problem/HDU-4513 吉哥系列故事——完美队形II Time Limit: 3000/1000 MS (Java/Others) Me ...
- hdu----(4513)吉哥系列故事——完美队形II(manacher(最长回文串算法))
吉哥系列故事——完美队形II Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)To ...
- HDU4513吉哥系列故事――完美队形II(manacher算法)
这个比最长回文子串就多了一个条件,就是回文字串(这里相当于人的高度)由两端向中间递增. 才刚刚看了看manacher,在用模板A了一道题后,还没有完全理解manacher,然后就准备把这道题也直接带模 ...
- hdu4513之manacher算法
吉哥系列故事——完美队形II Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) T ...
- 马拉车算法——边界拓展时加限制hdu4513
#include<bits/stdc++.h> using namespace std; #define maxn 500005 int n,p[maxn],s[maxn],s_new[m ...
- KMP 、扩展KMP、Manacher算法 总结
一. KMP 1 找字符串x是否存在于y串中,或者存在了几次 HDU1711 Number Sequence HDU1686 Oulipo HDU2087 剪花布条 2.求多个字符串的最长公共子串 P ...
- manacher(马拉车算法)
Manacher(马拉车算法) 序言 mannacher 是一种在 O(n)时间内求出最长回文串的算法 我们用暴力求解最长回文串长度的时间复杂度为O(n3) 很明显,这个时间复杂度我们接受不了,这时候 ...
- B树——算法导论(25)
B树 1. 简介 在之前我们学习了红黑树,今天再学习一种树--B树.它与红黑树有许多类似的地方,比如都是平衡搜索树,但它们在功能和结构上却有较大的差别. 从功能上看,B树是为磁盘或其他存储设备设计的, ...
随机推荐
- 获取select框下option所有值
document.getElementById('roomId').options[0].value;获取第一个值 var roomIds = $("#roomId option" ...
- 使List<userClass>.Contains可以查找重復的對象
List.Contains实现对比 http://blog.csdn.net/yswucn/article/details/4091469
- 内存管理2-set方法的内存管理-程序解析
创建class Book .h 有@ property float price; //@synthesize 自动 ------------ 创建class Student #import &quo ...
- sublime的一些记录
{ "keys": ["tab"], "command": "reindent", "context" ...
- Consul CAP理论纠错
Consul CAP理论纠错 随便搜索Consul.zookeeper.etcd.eureka注册中心比较相关博客文章,你都会发现千篇一律的是以下这幅对比图:但是我对Consul使用的是CA架构还是C ...
- 调试NTDLL加载
1 随便切到一个进程 0: kd> !process 0 0 explorer.exePROCESS 8157e9a8 SessionId: 0 Cid: 06a4 Peb: 7ffde000 ...
- WINRAR弹窗堆栈
0:000> db 004ddfa8004ddfa8 6f 00 70 00 65 00 6e 00-00 00 00 00 2d 00 6e 00 o.p.e.n.....-.n. 03063 ...
- Leetcode题目292.Nim游戏(脑筋急转弯)
题目描述: 你和你的朋友,两个人一起玩 Nim 游戏:桌子上有一堆石头,每次你们轮流拿掉 1 - 3 块石头. 拿掉最后一块石头的人就是获胜者.你作为先手. 你们是聪明人,每一步都是最优解. 编写一个 ...
- Python颜色分类及格式
Python字符串颜色使用下面方式进行修改 \033[显示方式;字体色;背景色m 字符串 \033[0m 显示方式包括: 0 终端默认设置 1 高亮显示 4 使用下划线 5 闪烁 7 反白显 ...
- 从UDP的”连接性”说起–告知你不为人知的UDP
原文地址:http://bbs.utest.qq.com/?p=631 很早就计划写篇关于UDP的文章,尽管UDP协议远没TCP协议那么庞大.复杂,但是,要想将UDP描述清楚,用好UDP却要比TCP难 ...