吉哥又想出了一个新的完美队形游戏!
  假设有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. Haproxy-1.8.20 根据路径(URI)转发到后端不同集群

    HAProxy根据不同的URI 转发到后端的服务器组 1 ) 实验内容说明: 1.1 ) 根据不同的URI 转发到后端的服务器组. /a /b 和其他 默认使用其他. 1.2 ) 使用IP介绍: ha ...

  2. Win 10 Docker安装和简单使用

    Win 10 Docker安装和简单使用 1.环境准备 Docker for Windows需要运行在64位Windows 10 Pro专业版.企业版或教育版(1607年纪念更新,版本14393或更高 ...

  3. 3610:20140827:161308.483 No active checks on server: host [192.168.1.10] not found

    3610:20140827:161308.483 No active checks on server: host [192.168.1.10] not found

  4. iconv函数报错 Detected an illegal character in input string

    近日使用php代码导出文件为excel,一直乱码.导出修改编码都无效,最后发现,是需要修改php导出代码本身的编码.首先用记事本打开php代码,另存为,选择ANSI格式.然后打开iconv函数这个ph ...

  5. 【Nginx】yum安装nginx

    这里是nginx的yum安装源: centos7: rpm -ivh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-cent ...

  6. 【Oracle】想查询相关的v$视图,但是提示表或视图不存在解决办法

    原因是使用的用户没有相关的查询权限导致 解决办法: grant select  any dictionary to 用户;    --这个权限比较大 这个权限是最低的要求,但是可以访问到v$相关视图 ...

  7. SQL Server management studio使用sa连接时报错与伺服器的连接已成功,但在登入程序是发生错误

    使用Sql Server management studio的sa用户连接数据库时,报如下错误 解决方法: 1.使用windows验证登录 2.右键点击连接,点击属性,点击安全性,选择混合验证 3.重 ...

  8. 【Azure App Service For Container】创建ASP.NET Core Blazor项目并打包为Linux镜像发布到Azure应用服务

    欢迎使用 Blazor!Blazor 是一个使用 .NET 生成交互式客户端 Web UI 的框架: 使用 C# 代替 JavaScript 来创建信息丰富的交互式 UI. 共享使用 .NET 编写的 ...

  9. AOP面向切面编程(使用注解和使用配置文件)

    Aop(面向切面编程) 使用注解的方式: 加入相应的jar包: com.springsource.org.aopalliance-1.0.0.jar com.springsource.org.aspe ...

  10. pymysql模块使用介绍

    pymysql ​ 我们要学的pymysql就是用来在python程序中如何操作mysql,本质上就是一个套接字客户端,只不过这个套接字客户端是在python程序中用的,既然是客户端套接字,应该怎么用 ...