题目链接http://acm.hdu.edu.cn/showproblem.php?pid=4513

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
  请输出能组成完美队形的最多人数,每组输出占一行。
 
思路:
1.要求选出的人在原队列中连续且想对顺序不变,即连续的子串。
2.该连续的子串中,左右对称,即连续回文子串。
3.限制条件:选出的队列呈现“凸字形”
4.最长,到此题意清晰,发现可以用mannacher算法来写,只是要注意在求解p[]数组时要加上题目限制条件。
代码:
 #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算法】的更多相关文章

  1. 马拉车算法,mannacher查找最长回文子串

    作用: 在线性时间内找到一个字符串的最大回文子串 原理: 奇偶变换:为处理字符串方便,现将给定的任意字符串进行处理,使所有可能的奇数/偶数长度的回文子串都转换成了奇数长度. 具体就是在每个字符的两边都 ...

  2. HDU4513 吉哥系列故事——完美队形II Manacher算法

    题目链接:https://vjudge.net/problem/HDU-4513 吉哥系列故事——完美队形II Time Limit: 3000/1000 MS (Java/Others)    Me ...

  3. hdu----(4513)吉哥系列故事——完美队形II(manacher(最长回文串算法))

    吉哥系列故事——完美队形II Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)To ...

  4. HDU4513吉哥系列故事――完美队形II(manacher算法)

    这个比最长回文子串就多了一个条件,就是回文字串(这里相当于人的高度)由两端向中间递增. 才刚刚看了看manacher,在用模板A了一道题后,还没有完全理解manacher,然后就准备把这道题也直接带模 ...

  5. hdu4513之manacher算法

    吉哥系列故事——完美队形II Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) T ...

  6. 马拉车算法——边界拓展时加限制hdu4513

    #include<bits/stdc++.h> using namespace std; #define maxn 500005 int n,p[maxn],s[maxn],s_new[m ...

  7. KMP 、扩展KMP、Manacher算法 总结

    一. KMP 1 找字符串x是否存在于y串中,或者存在了几次 HDU1711 Number Sequence HDU1686 Oulipo HDU2087 剪花布条 2.求多个字符串的最长公共子串 P ...

  8. manacher(马拉车算法)

    Manacher(马拉车算法) 序言 mannacher 是一种在 O(n)时间内求出最长回文串的算法 我们用暴力求解最长回文串长度的时间复杂度为O(n3) 很明显,这个时间复杂度我们接受不了,这时候 ...

  9. B树——算法导论(25)

    B树 1. 简介 在之前我们学习了红黑树,今天再学习一种树--B树.它与红黑树有许多类似的地方,比如都是平衡搜索树,但它们在功能和结构上却有较大的差别. 从功能上看,B树是为磁盘或其他存储设备设计的, ...

随机推荐

  1. Codeforces Round #442 (Div. 2) B题【一道模拟题QAQ】

    B. Nikita and string One day Nikita found the string containing letters "a" and "b&qu ...

  2. 多路IO复用模型--select, poll, epoll

    select 1.select能监听的文件描述符个数受限于FD_SETSIZE,一般为1024,单纯改变进程打开的文件描述符个数并不能改变select监听文件个数 2.解决1024以下客户端时使用se ...

  3. python 批量创建文件及文件夹(文件夹里再创文件)

    python 批量创建文件及文件夹(文件夹里再创文件)思路:文件建到哪>文件名字叫啥>创建文件夹>去新建的文件下>新建文件>给文件里边写东西>写个反馈给控制台> ...

  4. 【概率论】3-7:多变量分布(Multivariate Distributions Part II)

    title: [概率论]3-7:多变量分布(Multivariate Distributions Part II) categories: Mathematic Probability keyword ...

  5. 【线性代数】5-2:置换和余因子(Permutations and Cofactors)

    title: [线性代数]5-2:置换和余因子(Permutations and Cofactors) categories: Mathematic Linear Algebra keywords: ...

  6. oracle insert into 多条数据

    mysql : insert into tablename (column1,column2) values ('aa','bb'), ('dd','cc'), ('ee','ff'); oracle ...

  7. asp.net core 控制静态文件的授权

    静态文件访问在网站中是一项重要的服务,用于向前端提供可以直接访问的文件,如js,css,文档等,方法是在Startup的Configure中添加UseStaticFiles()管道. 参考:ASP.N ...

  8. 北大ACM - POJ试题分类

    1.入门水题 可用于练手与增强自信 POJ-1003POJ-1004 POJ-1005 POJ-1207 POJ-3299 POJ-2159 POJ-1083POJ-3094 2.初级 2.1. 基本 ...

  9. Google Directions API 中路线编码解析

    public List<Location> GetGeoPoints(string encoded) { List<Location> poly = new List<L ...

  10. Server 2012使用Windows PowerShell cmdlet安装角色和角色服务功能

    Server 2012使用Windows PowerShell cmdlet安装角色和角色服务功能  Windows Server 2012 安装 SQL server 2008 出现了如下错误: 解 ...