题目链接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[]数组时要加上题目限制条件。
代码:
  1. #include<stdio.h>
  2. #include<algorithm>
  3. #include<string.h>
  4. #define mem(a, b) memset(a, b, sizeof(a))
  5. using namespace std;
  6. const int MAXN = 1e5 + ;
  7. const int inf = 0x3f3f3f3f;
  8.  
  9. int n;
  10. int a[MAXN], s[ * MAXN], len, p[ * MAXN];
  11.  
  12. void get_s() //为了避免因 奇数偶数长度的串 引起的讨论,直接构造新的数列
  13. {
  14. s[] = -inf;
  15. s[] = -;
  16. len = ;
  17. for(int i = ; i <= n; i ++)
  18. {
  19. s[++ len] = a[i];
  20. s[++ len] = -;
  21. }
  22. s[++ len] = inf; //防止越界 s[0] 与 s[len]必须不相同
  23. }
  24.  
  25. int mannacher()
  26. {
  27. int mx = , id = , maxlen = -;
  28. mem(p, ); //每个点的最长回文半径初始化为 0
  29. for(int i = ; i < len; i ++) //除去了边界
  30. {
  31. if(i < mx)//先获取该点的回文半径当前最长长度 待更新
  32. p[i] = min(p[id - (i - id)], mx - i);
  33. else
  34. p[i] = ;
  35. while(s[i - p[i]] == s[i + p[i]] && s[i - p[i]] <= s[i - p[i] + ]) //限制条件
  36. p[i] ++;
  37. if(i + p[i] > mx)
  38. {
  39. mx = i + p[i];
  40. id = i;
  41. }
  42. maxlen = max(maxlen, p[i] - );
  43. }
  44. return maxlen;
  45. }
  46.  
  47. int main()
  48. {
  49. int T;
  50. scanf("%d", &T);
  51. while(T --)
  52. {
  53. scanf("%d", &n);
  54. len = ;
  55. for(int i = ; i <= n; i ++)
  56. scanf("%d", &a[i]);
  57. get_s();
  58. int ans = mannacher();
  59. printf("%d\n", ans);
  60. }
  61. return ;
  62. }

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. python原生操作mysql

    import pymysql HOST = '127.0.0.1' PORT = 3306 USER = 'root' PASSWD = ' DB = 'test' CHARSET = 'utf8' ...

  2. Oracle 审计 部署监控 user DML操作

    1.移动audit表及索引到dbadmin表空间 alter table aud$ move tablespace DBADMIN;alter table AUDIT$ move tablespace ...

  3. CF 940F - Machine Learning ( 带 修 )

    题目: 链接:https://codeforces.com/problemset/problem/940/F 题意:给你n个数,a[i]有q个操作,操作有两种:操作1.       1 x y 表示询 ...

  4. scss的使用

    看到一篇很好的文章,感觉不用我自己总结了, 上个链接:https://blog.csdn.net/zhouzuoluo/article/details/81010331

  5. elasticsearch _update api 更新部分字段内容

    https://www.elastic.co/guide/cn/elasticsearch/guide/current/partial-updates.htmlupdate 请求最简单的一种形式是接收 ...

  6. Docker安装redis3.2

    1.拉取redis3.2镜像 2.使用docker images查看拉去下来的镜像 3.运行容器,命令如下 docker run -p : -v $PWD/data:/data -d redis:3. ...

  7. 你真的会用go语言写单例模式吗?

    最近在学习Golang,想着可以就以前的知识做一些串通,加上了解到go语言也是面向对象编程语言之后.在最近的开发过程中,我碰到一个问题,要用go语言实现单例模式.本着“天下知识,同根同源”(我瞎掰的~ ...

  8. 为什么使用Spring Boot

    原文:https://dzone.com/articles/why-springboot 作者:Siva Prasad Reddy Katamreddy 译者:Oopsguy 本文将介绍各种 Spri ...

  9. GitHub排名TOP30的机器学习开源项目/贪心学院

    对于机器学习者来说,阅读开源代码并基于代码构建自己的项目,是一个非常有效的学习方法.看看以下这些Github上平均star为3558的开源项目,你错了哪些? 1. FastText:快速文本表示和文本 ...

  10. OpenResty之ngx_lua模块的加密接口

    原文: ngx_Lua模块中的加密api接口 ngx.crc32_short digest = ngx.crc32_short(str) 该方法主要是计算给定字符串 str 的循环校验码(Cyclic ...