吉哥系列故事——完美队形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) ...
随机推荐
- 深入理解MySQL索引(下)
先创建一个T表. mysql> create table T ( ID int primary key, k int NOT NULL DEFAULT 0, s varchar(16) NOT ...
- Promethues 之 Thanos
Promethues简介和原理 请看我之前写的 Prometheus简介,原理和安装 https://www.cnblogs.com/you-men/p/12839535.html 官方架构问题 官方 ...
- (二)数据源处理2-xlrd操作excel
import xlrd3workbook = xlrd3.open_workbook('test_data.xlsx')sheet =workbook.sheet_by_name('Sheet1')p ...
- CTFshow-萌新赛web_假赛生
打开靶机 网页源码提示代码如下 根据提示,存在 login.php register.php,根据要求需要用户名为admin,尝试注册后发现已存在,接着尝试注册用户名admin+空格,接着用admin ...
- 入门OJ:售货员的难题
题目描述 某乡有n个村庄(1<n<15),有一个售货员,他要到各个村庄去售货,各村庄之间的路程s(0<s<1000)是已知的,且A村到B村与B村到A村的路大多不同.为了提高效率 ...
- 入门OJ:扫雪
扫雪1 题目描述 大雪履盖了整个城市,市政府要求冬季服务部门尽快将一些街道(列在一份清单中)的积雪清除掉以恢复交通,整个城市由许多交叉路口和街道构成,当然任意两个交叉路口都是直接或间接连通的,清单给出 ...
- .NET Core 问题记录
前言: 最近在项目中遇到了遇到了写部署步骤过多的问题,为了减少.net core项目部署步骤:需要对一些基础问题进行验证: 如端口设置.单页应用程序(angluar)合并部署方式等相关问题,特将解决过 ...
- ORM动态表达式树查询
前言 接口获取参数后,创建返回值模型的条件表达式作为参数,传入使用依赖注入实例化后的业务层. 业务层创建返回值模型的IQUERY后,再使用参数条件表达式.最后进行延迟查询. 代码实现 参数模型Demo ...
- 计算机网络安全 —— 非对称加密算法 RSA 和数字签名(二)
一.非对称加密算法基本概念 在对称密钥系统中,两个参与者要共享同一个秘密密钥.但怎样才能做到这一点呢?一种是事先约定,另一种是用信使来传送.在高度自动化的大型计算机网络中,用信使来传送密钥显然是不合适 ...
- Flutter--Flutter开发环境搭建
一.前言 Flutter 是 Google推出并开源的移动应用开发框架,主打跨平台.高保真.高性能.开发者可以通过 Dart语言开发 App,一套代码同时运行在 iOS 和 Android平台. Fl ...