hdu4513吉哥系列故事——完美队形II 马拉车
题意:求最长回文串长度,要求回文串左边是非下降。
思路一:
先把连续的回文串,满足先上升再下降的序列处理出来,再对这部分序列做马拉车模板就可以了。
需要注意的是,由于他要的是非下降的序列,所以要注意等于的情况。
还需要注意的是,写马拉车的板子习惯用的是char。。但是char的上限是255,'0'+250会爆char。因为这个wa了好几天也没想出bug是什么。
思路二:
对马拉车算法进行修改,只要在判断回文的时候加入递增这个条件即可。
两个思路都实现了一遍。
#include<bits/stdc++.h>
#define clr(a,b) memset(a,b,sizeof(a))
using namespace std;
typedef long long ll;
const int maxn=;
int s[maxn<<],ne[maxn<<];
int p[maxn<<],mx,maxx,n,T,a[maxn<<],b[maxn],cnt; int init(int b[],int len){
int j=;
ne[]='$',ne[]='#';
for(int i=;i<=len;i++)
{
ne[j++]=(''+b[i]);
ne[j++]='#';
}
ne[j]='\0';
return j;
}
void Manacher(int b[],int len)
{
if(len==)return;
len=init(b,len);
int id,ma=;
for(int i=;i<len;i++)
{
if(i<ma){
p[i]=min(p[*id-i],ma-i);
}else p[i]=;
while(ne[i-p[i]]==ne[i+p[i]])p[i]++;
maxx=max(maxx,p[i]);
if(i+p[i]>ma){
ma=i+p[i];
id=i;
}
}
}
int main(){
// printf("%d %d %d\n",'#','$','\0');
cin>>T;
while(T--)
{
cin>>n;
for(int i=;i<=n;i++)
{
scanf("%d",&a[i]);
}
cnt=,maxx=;
int flag=;
for(int i=;i<=n;i++)
{
if(a[i]>=a[i-]&&flag==){
b[++cnt]=a[i];
}else if(a[i]<=a[i-]){
flag=;
b[++cnt]=a[i];
}else{
Manacher(b,cnt);
cnt=flag=;
int j=i-;
while(a[j]<=a[j+]){
if(j==)break;
b[++cnt]=a[j];
j--;
}
b[++cnt]=a[i];
}
}
Manacher(b,cnt);
printf("%d\n",maxx-);
}
}
#include<bits/stdc++.h>
#define clr(a,b) memset(a,b,sizeof(a))
using namespace std;
typedef long long ll;
const int maxn=;
int s[maxn<<],ne[maxn<<];
int p[maxn<<],mx,maxx,n,T,a[maxn<<],b[maxn<<],cnt;
int init(){
int j=;
ne[]=-;
ne[]=;
for(int i=;i<=n;i++)
{
ne[j++]=a[i];
ne[j++]=;
}
ne[j]=-;
//printf("j:%d n:%d\n",j,n);
return j;
}
int Manacher(){
int len=init();
int id,ma=,mx=;
//printf("len:%d\n",len);
for(int i=;i<len;i++)
{
if(i<ma){
p[i]=min(p[*id-i],ma-i);
}else p[i]=;
int k=ne[i];
while(ne[i-p[i]]==ne[i+p[i]]&&(ne[i-p[i]]==||ne[i-p[i]]<=k)){
if(ne[i-p[i]]!=)k=ne[i-p[i]];
p[i]++;
}
if(i+p[i]>ma){
ma=i+p[i];
id=i;
}
mx=max(mx,p[i]);
// printf("i:%d mx:%d\n",i,mx);
}
return mx-;
}
int main(){
cin>>T;
while(T--)
{
cin>>n;
for(int i=;i<=n;i++)
{
scanf("%d",&a[i]);
}
maxx=Manacher();
cout<<maxx<<endl;
}
}
hdu4513吉哥系列故事——完美队形II 马拉车的更多相关文章
- HDU4513 吉哥系列故事——完美队形II Manacher算法
题目链接:https://vjudge.net/problem/HDU-4513 吉哥系列故事——完美队形II Time Limit: 3000/1000 MS (Java/Others) Me ...
- hdu----(4513)吉哥系列故事——完美队形II(manacher(最长回文串算法))
吉哥系列故事——完美队形II Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)To ...
- HDU4513吉哥系列故事――完美队形II(manacher算法)
这个比最长回文子串就多了一个条件,就是回文字串(这里相当于人的高度)由两端向中间递增. 才刚刚看了看manacher,在用模板A了一道题后,还没有完全理解manacher,然后就准备把这道题也直接带模 ...
- HDU4513:吉哥系列故事——完美队形II(Manacher)
吉哥系列故事——完美队形II Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)To ...
- 吉哥系列故事——完美队形II(hdu4513+Manacher)
吉哥系列故事--完美队形II Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) T ...
- HDU 4513 吉哥系列故事——完美队形II manacher
吉哥系列故事——完美队形II Problem Description 吉哥又想出了一个新的完美队形游戏! 假设有n个人按顺序站在他的面前,他们的身高分别是h[1], h[2] ... h[n],吉哥希 ...
- (回文串 Manacher)吉哥系列故事——完美队形II -- hdu -- 4513
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--最长回文
吉哥系列故事——完美队形II Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)To ...
随机推荐
- boost 错误报告
#include <Windows.h> #include <boost/asio.hpp> 编译器会报错,fatal error C1189: #error : WinSo ...
- pandas dataframe 满足条件的样本提取
pandas 的dataframe 对 数据查询可以通过3种方式 . 预备知识: 1. pandas 的索引和label都是从0开始的计数的 2. 时间切片都是左闭右开的. [5:6,:] 只会输出 ...
- CopyOnWriteArrayList原理
http://blog.csdn.net/chayangdz/article/details/76347465 总结的很到位: http://www.cnblogs.com/java-zhao/p/5 ...
- Maven——继承和聚合
实际项目中,可能正要构建一个大型的系统,但又不想一遍又一遍的重复同样的依赖元素,这种情况是经常出现的.不过还好,maven提供了继承机制,项目可以通过parent元素使用继承,可以避免这种重复.当一个 ...
- 【原创】boost::recursive_mutex请小心使用
recursive_mutex会减少死锁几率?恩看上去的确如此,但是事实上呢?我们从BOOST的官方逻辑去理解: recursive_mutex类可多次进入锁,这样在递归时可以避免一次死锁的几率,这是 ...
- bootstrap页面效果图
<!DOCTYPE html><html lang="zh-cn"><head><meta charset="utf-8&quo ...
- javascript总结2: Date对象
1 Date 对象 Date 对象用于处理日期与时间. Date()的方法很多,这里只总结工作必备的方法! 2 常用方法 创建个 Date 对象:const mydate=new Date(); &l ...
- 【Android学习】Android工程资源命名禁忌
在制作一个继续按钮时,将button的id设置为continue,发现报了错误,error: invalid symbol: 'continue' 一开始还以为是编码问题,后来百度之后才知道安卓And ...
- 删除一个数的K位使原数变得最小
原创 给定一个n位正整数a, 去掉其中k个数字后按原左右次序将组成一个新的正整数.对给定的a, k寻找一种方案,使得剩下的数字组成的新数最小. 提示:应用贪心算法设计求解 操作对象为n位正整数,有可能 ...
- java实现wc功能
github项目地址:https://github.com/3216004717/ruanjiangongcheng.git 项目相关要求 基本要求 wc.exe -c file.c //返回文件 f ...