吉哥又想出了一个新的完美队形游戏!
  假设有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(马拉车算法)的更多相关文章

  1. HDU4513 吉哥系列故事——完美队形II Manacher算法

    题目链接:https://vjudge.net/problem/HDU-4513 吉哥系列故事——完美队形II Time Limit: 3000/1000 MS (Java/Others)    Me ...

  2. hdu4513吉哥系列故事——完美队形II 马拉车

    题目传送门 题意:求最长回文串长度,要求回文串左边是非下降. 思路一: 先把连续的回文串,满足先上升再下降的序列处理出来,再对这部分序列做马拉车模板就可以了. 需要注意的是,由于他要的是非下降的序列, ...

  3. HDU 4513 吉哥系列故事——完美队形II manacher

    吉哥系列故事——完美队形II Problem Description 吉哥又想出了一个新的完美队形游戏! 假设有n个人按顺序站在他的面前,他们的身高分别是h[1], h[2] ... h[n],吉哥希 ...

  4. hdu----(4513)吉哥系列故事——完美队形II(manacher(最长回文串算法))

    吉哥系列故事——完美队形II Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)To ...

  5. (回文串 Manacher)吉哥系列故事——完美队形II -- hdu -- 4513

    http://acm.hdu.edu.cn/showproblem.php?pid=4513 吉哥系列故事——完美队形II Time Limit: 3000/1000 MS (Java/Others) ...

  6. hdu 4513 吉哥系列故事——完美队形II (manachar算法)

    吉哥系列故事——完美队形II Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) P ...

  7. HDU4513:吉哥系列故事——完美队形II(Manacher)

    吉哥系列故事——完美队形II Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)To ...

  8. HDU 4513 吉哥系列故事――完美队形II(Manacher)

    题目链接:cid=70325#problem/V">[kuangbin带你飞]专题十六 KMP & 扩展KMP & Manacher V - 吉哥系列故事――完美队形I ...

  9. 吉哥系列故事——完美队形II(hdu4513+Manacher)

    吉哥系列故事--完美队形II Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) T ...

  10. HDU 4513 吉哥系列故事――完美队形II

    http://acm.hdu.edu.cn/showproblem.php?pid=4513 吉哥系列故事——完美队形II Time Limit: 3000/1000 MS (Java/Others) ...

随机推荐

  1. 二进制格式 PLY 模型文件的读取与渲染

    PLY 文件头部信息: ply format binary_little_endian 1.0 comment VCGLIB generated element vertex 13469 proper ...

  2. windows下使用mingw和msvc静态编译Qt5.15.xx

    windows下使用mingw和msvc静态编译Qt5.15.xx 下载并安装相关依赖软件 Python version 2.7 https://www.python.org/downloads/ ( ...

  3. 【Spring】创建一个Spring的入门程序

    3.创建一个Spring的入门程序 简单记录 - Java EE企业级应用开发教程(Spring+Spring MVC+MyBatis)- Spring的基本应用 Spring与Spring MVC的 ...

  4. 不要把file,process或者super权限授予管理员以外的账号

    file权限的主要作用是通过select ....into outfile 写到服务器上具有写权限的目录下,作为文本格式存放,具有权限的目录也就是启动mysql时的用户权限目录.(没有理解) 可以将有 ...

  5. 【Oracle】instr()函数详解

    1)instr()函数的格式  (俗称:字符查找函数) 格式一:instr( string1, string2 )    /   instr(源字符串, 目标字符串) 格式二:instr( strin ...

  6. Web安全之CSRF(跨站请求伪造)

    CSRF(跨站请求伪造)概述 Cross-site request forgery 简称为"CSRF",在CSRF的攻击场景中攻击者会伪造一个请求(这个请求一般是一个链接),然后欺 ...

  7. 2021年首届.NET线下沙龙上海站 - 2021 .NET Meetup in Shanghai

    .NET Conf 2020 刚刚在苏州落下帷幕, .NET 开发者们的热情不减,来自五湖四海的朋友一起参加疫情之下的 .NET 盛会. 2021年上海第一场线下活动就要来了,快来加入我们一起学习.N ...

  8. .NET Core使用Source Link提高源代码调试体验和生产效率

    前言: 在我们日常开发过程中常常会使用到很多其他封装好的第三方中间件(NuGet依赖项).类库或者是.NET框架中自带的库.但是当你想要对这些类库的方法设置断点调试,然后发现无法F11(逐语句)调试进 ...

  9. ElasticSearch Python 基本操作

    创建索引 from elasticsearch import Elasticsearch es = Elasticsearch('192.168.149.96:9200') mappings = { ...

  10. watchdog应用实例

    watchdog应用实例 By 鬼猫猫 20130504 http://www.cnblogs.com/muyr/ 实例:监测某文件夹,一旦文件夹里有文件,就把它剪切到其他服务器 import sys ...