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树是为磁盘或其他存储设备设计的, ...
随机推荐
- ad_hoc详解
import shutil from collections import namedtuple from ansible.parsing.dataloader import DataLoader f ...
- List根据某字段去重,以及compareTo 浅解
原文链接:https://blog.csdn.net/qq_35788725/article/details/82259013 Collections.sort可对集合进行排序 根据List里面某个字 ...
- [Luogu] 染色
https://www.luogu.org/problemnew/show/P2486 qizha 为什么会wa #include <cstdio> #include <cmath& ...
- [HNOI2008] 越狱 快速幂
[HNOI2008] 越狱 快速幂 水.考虑不发生越狱的情况:即宗教相同的都不相邻,一号任意放\(m\)种宗教的人,此后\(n-1\)个房间都放与上一个宗教不同的人,有\(m-1\)种,所以共有\(m ...
- python基础-垃圾回收机制
垃圾回收 Python中的垃圾回收是以引用计数为主,分代收集为辅.引用计数的缺陷是循环引用的问题. 引用计数 原理:当一个对象的引用被创建或者复制时,对象的引用计数加1:当一个对象的引用被销毁时,对象 ...
- re,xpath,BeautifulSoup三种方法爬取古诗词网上诗歌
re,xpath ,bs4对同一个页面的解析速度发现re比xpath快接近10倍,xpath比bs4快接近10倍可见要想追求极致速度,使用正则表达式解析有多重要 1.re解析的代码 # 使用正则表达式 ...
- c语言 宏
#代表命令要被预处理器处理#define 定义的宏可以出现在程序的任意位置#define 定义之后的代码都可以使用这个宏 宏是字面量,不占用内存 单步编译预处理器,只进行文本替换,不进行语法检查:gc ...
- 手写alert弹框(一)
采用原生的JavaScript, html代码 <meta name="viewport" content="width=device-width, initial ...
- Flutter移动电商实战 --(18)首页_火爆专区商品接口制作
1.获取接口的方法 在service/service_method.dart里制作方法.我们先不接收参数,先把接口调通. Future getHomePageBeloConten() async{ t ...
- JavaWeb——Get、Post请求中文乱码问题
最近在重温JavaWeb基础内容,碰到了之前也时常遇到的中文乱码问题,想着反正是经常要处理的,不如当即就把它整理出来放在博客里,省得遇到时再去到处搜. 1. Post请求乱码的解决方案: 手工创建一个 ...