HDU 4513 吉哥系列故事——完美队形II (Manacher变形)
题意:假设有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再暴力寻找回文串是否没有找完整。最后我们的变形就在暴力处增加判断就好
- #include<set>
- #include<map>
- #include<queue>
- #include<stack>
- #include<cmath>
- #include<vector>
- #include<string>
- #include<cstdio>
- #include<cstring>
- #include<stdlib.h>
- #include<iostream>
- #include<algorithm>
- using namespace std;
- #define eps 1E-8
- /*注意可能会有输出-0.000*/
- #define Sgn(x) (x<-eps? -1 :x<eps? 0:1)//x为两个浮点数差的比较,注意返回整型
- #define Cvs(x) (x > 0.0 ? x+eps : x-eps)//浮点数转化
- #define zero(x) (((x)>0?(x):-(x))<eps)//判断是否等于0
- #define mul(a,b) (a<<b)
- #define dir(a,b) (a>>b)
- typedef long long ll;
- typedef unsigned long long ull;
- const int Inf=<<;
- const double Pi=acos(-1.0);
- const int Mod=1e9+;
- const int Max=;
- int num[Max];
- int Init(int n)//增加其他字符,让奇数偶数回文串都变成奇数回文串
- {
- for(int i=n-;i>=;--i)
- {
- num[(i<<)+]=num[i];
- num[(i<<)|]=;//不可能出现的字符
- }
- num[(n<<)|]=;
- num[]=;//边界
- num[(n<<)+]=;
- return (n<<)+;
- }
- int dp[Max];//每个位置匹配长度
- int Manacher(int n)
- {
- int manx=;
- int id=,maxid=;
- dp[]=;
- for(int i=;i<n;++i)
- {
- if(maxid>=i)
- dp[i]=min(dp[(id<<)-i],maxid-i+);
- else
- dp[i]=;
- while(num[i+dp[i]]==num[i-dp[i]]&&(num[i+dp[i]]==||num[i+dp[i]]<=num[i+dp[i]-]))//注意这儿需要修改
- dp[i]++;
- if(maxid<i+dp[i]-)
- {
- maxid=i+dp[i]-;
- id=i;
- }
- if(manx<dp[i]-)
- manx=dp[i]-;
- }
- return manx;
- }
- int main()
- {
- int t,n;
- scanf("%d",&t);
- while(t--)
- {
- scanf("%d",&n);
- for(int i=;i<n;++i)
- scanf("%d",&num[i]);
- n=Init(n);
- printf("%d\n",Manacher(n));
- }
- return ;
- }
HDU 4513 吉哥系列故事——完美队形II (Manacher变形)的更多相关文章
- Hdu 4513 吉哥系列故事——完美队形II (manacher变形)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4513 题目描述: 打完题目描述了,点开题目,发现题目是中文,orz.jpg.果断又删掉了,习惯真可怕 ...
- HDU 4513 吉哥系列故事――完美队形II(Manacher)
题目链接:cid=70325#problem/V">[kuangbin带你飞]专题十六 KMP & 扩展KMP & Manacher V - 吉哥系列故事――完美队形I ...
- HDU 4513 吉哥系列故事——完美队形II manacher
吉哥系列故事——完美队形II Problem Description 吉哥又想出了一个新的完美队形游戏! 假设有n个人按顺序站在他的面前,他们的身高分别是h[1], h[2] ... h[n],吉哥希 ...
- HDU 4513 吉哥系列故事――完美队形II
http://acm.hdu.edu.cn/showproblem.php?pid=4513 吉哥系列故事——完美队形II Time Limit: 3000/1000 MS (Java/Others) ...
- hdu 4513 吉哥系列故事——完美队形II (manachar算法)
吉哥系列故事——完美队形II Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) P ...
- HDU 4513 吉哥系列故事——完美队形II(Manacher)
Problem Description 吉哥又想出了一个新的完美队形游戏! 假设有n个人按顺序站在他的面前,他们的身高分别是h[1], h[2] ... h[n],吉哥希望从中挑出一些人,让这些人形成 ...
- HDU 4513 吉哥系列故事——完美队形II( Manacher变形 )
链接:传送门 思路:根据完美队形的定义,可以得知,完美队形实质上是 回文串 + 序列出现峰,因为是在回文串中再次增加了一个要求,所以可以对 Manacher 进行改造,改造的部分应该为暴力匹配的循环 ...
- HDU 4513 吉哥系列故事——完美队形II
变形的Manacher算法,在扩展的时候要加入限制条件,满足题目中说的从左到中间身高不减. 其他地方倒是没有什么改动.. //#define LOCAL #include <iostream&g ...
- HDU - 4513 吉哥系列故事――完美队形II(manacher)
1.找出一个最长的回文子串,要求中间的值最大,然后向两侧递减. 2.判断条件改为:Ma[i+Mp[i]]==Ma[i-Mp[i]]&&Ma[i-Mp[i]]<=Ma[i-Mp[i ...
随机推荐
- 11. javacript高级程序设计-DOM扩展
1. DOM扩展 1.1 选择符API l querySelector() 接收一个css选择符,返回与该模式匹配的第一个元素 l querySelectorAll() 接收一个css选择符,返回所有 ...
- JAVA volatile 关键字
一.volatile(易变的) Java 语言提供了一种稍弱的同步机制,即volatile修饰变量.用来确保将变量的更新操作通知到其他线程,保证了新值能立即同步到主内存,以及每次使用前立即从主内存刷新 ...
- 【工具】 原版完美激活 Flash builder 4.7 【非破解激活】
此方法原理在于激活 FlashBuilder 4.7 而不是破解(靠修改文件,或改变版本号),所以此破解更加稳定! FlashBuilder 4.7 下载地址: 32bit:http://trials ...
- oracle定时器,调用存储过程,定时从n张表中取值新增到本地一张表中
--创建新增本地数据库的存储过程create or replaceprocedure pro_electric_record as begin insert into electric_met ...
- GridView如何合并同类项
/// <summary> /// 合并GridView中某列相同信息的行(单元格) /// </summary> /// <param name ...
- Android笔记:管理所有活动
以关闭所有活动为例 public class ActivityCollector { public static List<Activity> activities = new Array ...
- XMPP框架下微信项目总结(5)花名册获取(好友列表)
---->概念 ---->添加花名册 ps:添加花名册,启动: 客户端发送请求到服务器获取好友列表信息,同时在项目中创建数据表,并保存好友列表到数据表中. ---->获取服务器保存好 ...
- yii2.0框架安装心得
yii2.0安装心得 能够搜索到这篇文章的朋友相信是对yii框架有兴趣的,但是我不得不吐槽的是,这个安装过程确实让人头疼,接下来就让大家见证一下这个纠结的过程 根据官网的说法,安装这个框架需要用到co ...
- Python 文件处理
文件夹: 得到当前工作目录,即当前Python脚本工作的目录路径: os.getcwd() 返回指定目录下的所有文件和目录名:os.listdir() 函数用来删除一个文件:os.remove() 删 ...
- Spring+Maven+Dubbo+MyBatis+Linner+Handlebars—Web开发环境搭建
本文主要分三部分,分别是:后台核心业务逻辑.桥梁辅助控制和前台显示页面. 本Web开发环境综合了多种工具,包括Maven包管理与编译工具.Dubbo分布式服务框架.MyBatis数据持久化工具.Lin ...