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 ...
随机推荐
- 手记-数学分析(高等数学)中有关算法效率的公式列举(O,Θ,Ω)
权当数据结构与算法分析的学习手记 系数为一的幂级数部分和公式 ∑ n2 = 12 + 22 + 32 + ... + n2 = n(n+1)(2n+1)/6 = O(n3) ∑ n3 = ...
- 21. javacript高级程序设计-Ajax与Comet
1. Ajax与Comet 1.1 XMLHttpRequest对象 IE5是第一款引入XHR对象的浏览器,IE5中是通过MSXML库中的一个ActiveX对象实现的.因此在IE中可能存在MSXML2 ...
- 8. javacript高级程序设计-BOM
1. BOM 1.1 window BOM的核心对象是window,它表示浏览器的一个实例.在浏览器中,window对象有双重身份, 1.1.1 全局作用域 由于window对象同时扮演着ECMASc ...
- UVALive 5903 Piece it together(二分图匹配)
给你一个n*m的矩阵,每个点为'B'或'W'或'.'.然后你有一种碎片.碎片可以旋转,问可否用这种碎片精确覆盖矩阵.N,M<=500 WB <==碎片 W 题目一看,感觉是精确覆盖(最近 ...
- C#传真传址 结构体
1.传真 传址 namespace 传值_传址 { class Program { //格式1:无参无返 public void LeiJia() { Console.Write("请输入 ...
- 【python】list,dict赋值不要用等号,要用extend,update
如果有一个list,我们用连等号的方式赋值 c = d = [1], 则当c改变时,d同样会改变.字典同理 正确做法应该是: d = [1] c = [1] 或者 d = [1] c.extend(d ...
- WebFrom 的js日期控件
1.WdatePicker.js /* * My97 DatePicker 4.7 Release * License: http://www.my97.net/dp/license.asp */ v ...
- DB2中错误信息说明
DB2错误信息SQLCODE SQLSTATE (按sqlcode排序) .分类: db2数据库 2012-10-19 11:35 2942人阅读 评论(0) 收藏 举报 db2sql存储table数 ...
- 【Bochs 官方手册翻译】 第一章 Bochs介绍
Bochs 是一个可以完全模拟 Intel x86 计算机的虚拟机系统.它包含了 Intel x86 CPU 仿真.常见设备仿真.以及定制 BIOS.Bochs 可以虚拟多种不同类型的 x86 CPU ...
- Qt 添加启动项
QString application_name = QApplication::applicationName(); QSettings *settings = new QSettings(&quo ...