吉哥系列故事——完美队形II(马拉车算法)
假设有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 请输出能组成完美队形的最多人数,每组输出占一行。Sample Input
- 2
- 3
- 51 52 51
- 4
- 51 52 52 51
Sample Output
- 3
- 4
题意:
就是让你找到一个最长回文子串,如果这个串是偶数,那么他的左边一半就要满足i<j且Ai<=Aj,也就是非严格递增类型
如果是奇数,那么中间那个数大小可以不受限制
题解:
就是在马拉车算法里面加一个判断,只是我前边那一种写的太麻烦了,所以超时了
具体看代码:
- 1 //#include<stdio.h>
- 2 //#include<string.h>
- 3 //#include<iostream>
- 4 //#include<algorithm>
- 5 //#include<set>
- 6 //using namespace std;
- 7 //const int maxn=300005;
- 8 //const int INF=0x3f3f3f3f;
- 9 //const int mod=998244353;
- 10 //int str[maxn],s[maxn];
- 11 //int len,Len[maxn];
- 12 //void init()
- 13 //{
- 14 // memset(str,0,sizeof(str));
- 15 // int k=0;
- 16 // str[k++]=10000;
- 17 // for(int i=0;i<len;++i)
- 18 // str[k++]=1000,str[k++]=s[i];
- 19 // str[k++]=1000;
- 20 // len=k;
- 21 //}
- 22 //int manacher()
- 23 //{
- 24 // Len[0]=0;
- 25 // int sum=0;
- 26 // int mx=0,id;
- 27 // for(int i=1;i<len;++i)
- 28 // {
- 29 // if(i<mx) Len[i]=min(mx-i,Len[2*id-i]);
- 30 // else Len[i]=1;
- 31 // while(str[i-Len[i]]==str[i+Len[i]]) Len[i]++;
- 32 // if(Len[i]+i>mx)
- 33 // {
- 34 // mx=Len[i]+i;
- 35 // id=i;
- 36 // int flag=0;
- 37 // if((Len[i]-1)%2)
- 38 // {
- 39 // if(Len[i]-1>=5)
- 40 // for(int j=i-4;j>j-Len[i];j-=2)
- 41 // {
- 42 // if(str[j]>str[j+2])
- 43 // {
- 44 // flag=1;
- 45 // break;
- 46 // }
- 47 // }
- 48 // }
- 49 // else
- 50 // {
- 51 // if(Len[i]-1>=4)
- 52 // for(int j=i-3;j>j-Len[i];j-=2)
- 53 // {
- 54 // if(str[j]>str[j+2])
- 55 // {
- 56 // flag=1;
- 57 // break;
- 58 // }
- 59 // }
- 60 // }
- 61 // if(!flag)
- 62 // sum=max(sum,Len[i]);
- 63 // }
- 64 // }
- 65 // return sum-1;
- 66 //}
- 67 //int main()
- 68 //{
- 69 // int t;
- 70 // scanf("%d",&t);
- 71 // while(t--)
- 72 // {
- 73 // memset(s,0,sizeof(s));
- 74 // scanf("%d",&len);
- 75 // for(int i=0;i<len;++i)
- 76 // scanf("%d",&s[i]);
- 77 // init();
- 78 // printf("%d\n",manacher());
- 79 // }
- 80 // return 0;
- 81 //}
- 82 #include<stdio.h>
- 83 #include<string.h>
- 84 #include<iostream>
- 85 #include<algorithm>
- 86 #include<set>
- 87 using namespace std;
- 88 const int maxn=300005;
- 89 const int INF=0x3f3f3f3f;
- 90 const int mod=998244353;
- 91 int str[maxn],s[maxn];
- 92 int len,Len[maxn];
- 93 void init()
- 94 {
- 95 memset(str,0,sizeof(str));
- 96 int k=0;
- 97 str[k++]=-1;
- 98 for(int i=0;i<len;++i)
- 99 str[k++]=0,str[k++]=s[i];
- 100 str[k++]=0;
- 101 len=k;
- 102 }
- 103 void manacher()
- 104 {
- 105 Len[0]=0;
- 106 int sum=0;
- 107 int id,mx=0;
- 108 for(int i=1;i<len;++i)
- 109 {
- 110 if(i<mx) Len[i]=min(mx-i,Len[2*id-i]);
- 111 else Len[i]=1;
- 112 int Min;
- 113 if(str[i] > 0) Min = str[i];
- 114 else Min = str[i + 1];
- 115 while(str[i - Len[i]] == str[i + Len[i]] && str[i - Len[i]] <= Min) {
- 116 //printf("are you here?\n");
- 117 if(str[i - Len[i]] > 0)
- 118 Min = str[i - Len[i]];
- 119 if(i + Len[i] > mx) {
- 120 mx = i + Len[i];
- 121 id = i;
- 122 }
- 123 Len[i]++;
- 124 }
- 125 }
- 126 int ans = 0;
- 127 for(int i = 1; i < len; i++) ans = max(ans, Len[i]);
- 128 printf("%d\n", ans - 1);
- 129 }
- 130 // if(Len[i]+i>mx)
- 131 // {
- 132 // mx=Len[i]+i;
- 133 // id=i;
- 134 // int flag=0;
- 135 // if((Len[i]-1)%2)
- 136 // {
- 137 // if(Len[i]-1>=5)
- 138 // for(int j=i-4;j>j-Len[i];j-=2)
- 139 // {
- 140 // if(str[j]>str[j+2])
- 141 // {
- 142 // flag=1;
- 143 // break;
- 144 // }
- 145 // }
- 146 // }
- 147 // else
- 148 // {
- 149 // if(Len[i]-1>=4)
- 150 // for(int j=i-3;j>i-Len[i];j-=2)
- 151 // {
- 152 // if(str[j]>str[j+2])
- 153 // {
- 154 // flag=1;
- 155 // break;
- 156 // }
- 157 // }
- 158 // }
- 159 // if(!flag)
- 160 // sum=max(sum,Len[i]);
- 161 // }
- 162 // }
- 163 // return (sum-1);
- 164 //}
- 165 int main()
- 166 {
- 167 int t;
- 168 scanf("%d",&t);
- 169 while(t--)
- 170 {
- 171 scanf("%d",&len);
- 172 for(int i=0;i<len;++i)
- 173 scanf("%d",&s[i]);
- 174 init();
- 175 manacher();
- 176 //printf("%d\n",);
- 177 }
- 178 return 0;
- 179 }
吉哥系列故事——完美队形II(马拉车算法)的更多相关文章
- HDU4513 吉哥系列故事——完美队形II Manacher算法
题目链接:https://vjudge.net/problem/HDU-4513 吉哥系列故事——完美队形II Time Limit: 3000/1000 MS (Java/Others) Me ...
- hdu4513吉哥系列故事——完美队形II 马拉车
题目传送门 题意:求最长回文串长度,要求回文串左边是非下降. 思路一: 先把连续的回文串,满足先上升再下降的序列处理出来,再对这部分序列做马拉车模板就可以了. 需要注意的是,由于他要的是非下降的序列, ...
- HDU 4513 吉哥系列故事——完美队形II manacher
吉哥系列故事——完美队形II Problem Description 吉哥又想出了一个新的完美队形游戏! 假设有n个人按顺序站在他的面前,他们的身高分别是h[1], h[2] ... h[n],吉哥希 ...
- hdu----(4513)吉哥系列故事——完美队形II(manacher(最长回文串算法))
吉哥系列故事——完美队形II Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)To ...
- (回文串 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 ...
- HDU4513:吉哥系列故事——完美队形II(Manacher)
吉哥系列故事——完美队形II Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)To ...
- HDU 4513 吉哥系列故事――完美队形II(Manacher)
题目链接:cid=70325#problem/V">[kuangbin带你飞]专题十六 KMP & 扩展KMP & Manacher V - 吉哥系列故事――完美队形I ...
- 吉哥系列故事——完美队形II(hdu4513+Manacher)
吉哥系列故事--完美队形II Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) T ...
- HDU 4513 吉哥系列故事――完美队形II
http://acm.hdu.edu.cn/showproblem.php?pid=4513 吉哥系列故事——完美队形II Time Limit: 3000/1000 MS (Java/Others) ...
随机推荐
- Head First 设计模式 —— 14. 复合 (Compound) 模式
复合模式 在一个解决方案中结合两个或多个模式,以解决一般或重复发生的问题. P500 思考题 public interface Quackable { public void quack(); } p ...
- 终于可以愉快的撸Java异步代码了!
异步响应式编程可以极大的提高系统的并发呑吐量,但由于Java没有类似于其他语言的Async/Await机制,所以只能通过CompletableFuture.thenXXX()来串联各个异步任务,这 ...
- ctfshow—web—web2
打开靶机,根据提示是SQL注入 打开后看到登录窗口 方法一.手工注入 抓取数据包 开始SQL注入测试 利用万能密码,登录成功 查看回显位置 查询数据库 查询数据库内数据表 如果想整齐一点显示可以添加g ...
- EF Core 6.0的新计划
今天,我们很兴奋地与你分享Entity Framework Core 6.0的计划. 这个计划汇集了许多人的意见,并概述了我们打算在哪里以及如何优化实体框架(EF Core) 6.0版本.这个计划并不 ...
- linux搭建简单samba服务器
1.安装需要的软体 yum install -y samba samba-client samba-common 2.创建samba需要的本地用户,创建samba服务使用的目录 Linux系统文件的读 ...
- kubernetes之为每个命名空间的pod设置默认的requests以及limits
一 为啥需要为命名空间里面添加pod添加默认的requests和limits? 通过前面的学习我们已经知道,如果节点上面的pod没有设置requests和limits,这些容器就会受那些设置了的控制 ...
- Java并发编程常识
这是why的第 85 篇原创文章 写中间件经常要做两件事: 1.延迟加载,在内存缓存已加载项. 2.统计调用次数,拦截并发量. 就这么个小功能,团队里的人十有八九写错. 上面这句话不是我说的,是梁飞在 ...
- hook笔记①
汇编中push 0x*** retn表示跳转到某个地址继续执行 取消hook时会在多线程环境中可能被检测 去掉函数框架可以规避寄存器cpu前后状态监测 #pragma comment(linker,& ...
- DevOps运动的缘起 将DevOps想象为一种编程语言里面的一个接口,而SRE类实现了这个接口
SRE vs DevOps:是敌是友? - DockOne.io http://www.dockone.io/article/5935 RE vs DevOps:是敌是友? [编者的话]网站可靠 ...
- Base64原理 bits 3->4 8bits/byte-->6bits/byte
实践: window.btoa('a')a YQ==abcdef YWJjZGVmabc YWJjab YWI= https://en.wikipedia.org/wiki/Base64 The Ba ...