题意:假设有n个人按顺序的身高分别是h[1], h[2] ... h[n],从中挑出一些人形成一个新的队形,新的队形若满足以下要求,则就是新的完美队形: 
  1、连续的
  2、形成回文串
  3、从左到中间那个人,身高需保证不下降

   问有组成完美队形的最多人数

题解:Manacher算法的变形。

首先我们来解释一下Manacher算法:在我看来就是一个优化的暴力。

我们首先统一奇偶回文串成为奇数回文串,就是在两个数之间加入一些不可能出现的数。

例如题目:1 2 3 3 2 5 2 3 1—>(符号更加清楚)$ # 1 # 2 # 3 # 3 # 2 # 5 # 2 # 3 # 1 # &(其中首尾多的#保证答案正确) ,注意首尾多增加 & 与 $ 为了不处理边界。接着我们只需要统计此时回文串长度的一半(包括中间一个字符)再减一就是此处总回文串的长度。

首先使用dp数组记录回文串一半长度,id记录最大dp的下标,maxid记录最大dp可以管到的最后一个距离,然后利用回文串的性质减少每次比较的次数

如图:在不超过maxid的位置(超过就不确定是否匹配成功了)j(i相对于id的对应位置)可以直接赋值给i,接着i再暴力寻找回文串是否没有找完整。最后我们的变形就在暴力处增加判断就好

  1. #include<set>
  2. #include<map>
  3. #include<queue>
  4. #include<stack>
  5. #include<cmath>
  6. #include<vector>
  7. #include<string>
  8. #include<cstdio>
  9. #include<cstring>
  10. #include<stdlib.h>
  11. #include<iostream>
  12. #include<algorithm>
  13. using namespace std;
  14. #define eps 1E-8
  15. /*注意可能会有输出-0.000*/
  16. #define Sgn(x) (x<-eps? -1 :x<eps? 0:1)//x为两个浮点数差的比较,注意返回整型
  17. #define Cvs(x) (x > 0.0 ? x+eps : x-eps)//浮点数转化
  18. #define zero(x) (((x)>0?(x):-(x))<eps)//判断是否等于0
  19. #define mul(a,b) (a<<b)
  20. #define dir(a,b) (a>>b)
  21. typedef long long ll;
  22. typedef unsigned long long ull;
  23. const int Inf=<<;
  24. const double Pi=acos(-1.0);
  25. const int Mod=1e9+;
  26. const int Max=;
  27. int num[Max];
  28. int Init(int n)//增加其他字符,让奇数偶数回文串都变成奇数回文串
  29. {
  30. for(int i=n-;i>=;--i)
  31. {
  32. num[(i<<)+]=num[i];
  33. num[(i<<)|]=;//不可能出现的字符
  34. }
  35. num[(n<<)|]=;
  36. num[]=;//边界
  37. num[(n<<)+]=;
  38. return (n<<)+;
  39. }
  40. int dp[Max];//每个位置匹配长度
  41. int Manacher(int n)
  42. {
  43. int manx=;
  44. int id=,maxid=;
  45. dp[]=;
  46. for(int i=;i<n;++i)
  47. {
  48. if(maxid>=i)
  49. dp[i]=min(dp[(id<<)-i],maxid-i+);
  50. else
  51. dp[i]=;
  52. while(num[i+dp[i]]==num[i-dp[i]]&&(num[i+dp[i]]==||num[i+dp[i]]<=num[i+dp[i]-]))//注意这儿需要修改
  53. dp[i]++;
  54. if(maxid<i+dp[i]-)
  55. {
  56. maxid=i+dp[i]-;
  57. id=i;
  58. }
  59. if(manx<dp[i]-)
  60. manx=dp[i]-;
  61. }
  62. return manx;
  63. }
  64. int main()
  65. {
  66. int t,n;
  67. scanf("%d",&t);
  68. while(t--)
  69. {
  70. scanf("%d",&n);
  71. for(int i=;i<n;++i)
  72. scanf("%d",&num[i]);
  73. n=Init(n);
  74. printf("%d\n",Manacher(n));
  75. }
  76. return ;
  77. }

HDU 4513 吉哥系列故事——完美队形II (Manacher变形)的更多相关文章

  1. Hdu 4513 吉哥系列故事——完美队形II (manacher变形)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4513 题目描述: 打完题目描述了,点开题目,发现题目是中文,orz.jpg.果断又删掉了,习惯真可怕 ...

  2. HDU 4513 吉哥系列故事――完美队形II(Manacher)

    题目链接:cid=70325#problem/V">[kuangbin带你飞]专题十六 KMP & 扩展KMP & Manacher V - 吉哥系列故事――完美队形I ...

  3. HDU 4513 吉哥系列故事——完美队形II manacher

    吉哥系列故事——完美队形II Problem Description 吉哥又想出了一个新的完美队形游戏! 假设有n个人按顺序站在他的面前,他们的身高分别是h[1], h[2] ... h[n],吉哥希 ...

  4. HDU 4513 吉哥系列故事――完美队形II

    http://acm.hdu.edu.cn/showproblem.php?pid=4513 吉哥系列故事——完美队形II Time Limit: 3000/1000 MS (Java/Others) ...

  5. hdu 4513 吉哥系列故事——完美队形II (manachar算法)

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

  6. HDU 4513 吉哥系列故事——完美队形II(Manacher)

    Problem Description 吉哥又想出了一个新的完美队形游戏! 假设有n个人按顺序站在他的面前,他们的身高分别是h[1], h[2] ... h[n],吉哥希望从中挑出一些人,让这些人形成 ...

  7. HDU 4513 吉哥系列故事——完美队形II( Manacher变形 )

    链接:传送门 思路:根据完美队形的定义,可以得知,完美队形实质上是 回文串 + 序列出现峰,因为是在回文串中再次增加了一个要求,所以可以对 Manacher 进行改造,改造的部分应该为暴力匹配的循环 ...

  8. HDU 4513 吉哥系列故事——完美队形II

    变形的Manacher算法,在扩展的时候要加入限制条件,满足题目中说的从左到中间身高不减. 其他地方倒是没有什么改动.. //#define LOCAL #include <iostream&g ...

  9. HDU - 4513 吉哥系列故事――完美队形II(manacher)

    1.找出一个最长的回文子串,要求中间的值最大,然后向两侧递减. 2.判断条件改为:Ma[i+Mp[i]]==Ma[i-Mp[i]]&&Ma[i-Mp[i]]<=Ma[i-Mp[i ...

随机推荐

  1. 11. javacript高级程序设计-DOM扩展

    1. DOM扩展 1.1 选择符API l querySelector() 接收一个css选择符,返回与该模式匹配的第一个元素 l querySelectorAll() 接收一个css选择符,返回所有 ...

  2. JAVA volatile 关键字

    一.volatile(易变的) Java 语言提供了一种稍弱的同步机制,即volatile修饰变量.用来确保将变量的更新操作通知到其他线程,保证了新值能立即同步到主内存,以及每次使用前立即从主内存刷新 ...

  3. 【工具】 原版完美激活 Flash builder 4.7 【非破解激活】

    此方法原理在于激活 FlashBuilder 4.7 而不是破解(靠修改文件,或改变版本号),所以此破解更加稳定! FlashBuilder 4.7 下载地址: 32bit:http://trials ...

  4. oracle定时器,调用存储过程,定时从n张表中取值新增到本地一张表中

    --创建新增本地数据库的存储过程create or replaceprocedure pro_electric_record as  begin    insert into electric_met ...

  5. GridView如何合并同类项

    /// <summary>     /// 合并GridView中某列相同信息的行(单元格)     /// </summary>     /// <param name ...

  6. Android笔记:管理所有活动

    以关闭所有活动为例 public class ActivityCollector { public static List<Activity> activities = new Array ...

  7. XMPP框架下微信项目总结(5)花名册获取(好友列表)

    ---->概念 ---->添加花名册 ps:添加花名册,启动: 客户端发送请求到服务器获取好友列表信息,同时在项目中创建数据表,并保存好友列表到数据表中. ---->获取服务器保存好 ...

  8. yii2.0框架安装心得

    yii2.0安装心得 能够搜索到这篇文章的朋友相信是对yii框架有兴趣的,但是我不得不吐槽的是,这个安装过程确实让人头疼,接下来就让大家见证一下这个纠结的过程 根据官网的说法,安装这个框架需要用到co ...

  9. Python 文件处理

    文件夹: 得到当前工作目录,即当前Python脚本工作的目录路径: os.getcwd() 返回指定目录下的所有文件和目录名:os.listdir() 函数用来删除一个文件:os.remove() 删 ...

  10. Spring+Maven+Dubbo+MyBatis+Linner+Handlebars—Web开发环境搭建

    本文主要分三部分,分别是:后台核心业务逻辑.桥梁辅助控制和前台显示页面. 本Web开发环境综合了多种工具,包括Maven包管理与编译工具.Dubbo分布式服务框架.MyBatis数据持久化工具.Lin ...