吉哥又想出了一个新的完美队形游戏!
  假设有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

  1. 2
  2. 3
  3. 51 52 51
  4. 4
  5. 51 52 52 51

Sample Output

  1. 3
  2. 4

题意:

就是让你找到一个最长回文子串,如果这个串是偶数,那么他的左边一半就要满足i<j且Ai<=Aj,也就是非严格递增类型

如果是奇数,那么中间那个数大小可以不受限制

题解:

就是在马拉车算法里面加一个判断,只是我前边那一种写的太麻烦了,所以超时了

具体看代码:

  1. 1 //#include<stdio.h>
  2. 2 //#include<string.h>
  3. 3 //#include<iostream>
  4. 4 //#include<algorithm>
  5. 5 //#include<set>
  6. 6 //using namespace std;
  7. 7 //const int maxn=300005;
  8. 8 //const int INF=0x3f3f3f3f;
  9. 9 //const int mod=998244353;
  10. 10 //int str[maxn],s[maxn];
  11. 11 //int len,Len[maxn];
  12. 12 //void init()
  13. 13 //{
  14. 14 // memset(str,0,sizeof(str));
  15. 15 // int k=0;
  16. 16 // str[k++]=10000;
  17. 17 // for(int i=0;i<len;++i)
  18. 18 // str[k++]=1000,str[k++]=s[i];
  19. 19 // str[k++]=1000;
  20. 20 // len=k;
  21. 21 //}
  22. 22 //int manacher()
  23. 23 //{
  24. 24 // Len[0]=0;
  25. 25 // int sum=0;
  26. 26 // int mx=0,id;
  27. 27 // for(int i=1;i<len;++i)
  28. 28 // {
  29. 29 // if(i<mx) Len[i]=min(mx-i,Len[2*id-i]);
  30. 30 // else Len[i]=1;
  31. 31 // while(str[i-Len[i]]==str[i+Len[i]]) Len[i]++;
  32. 32 // if(Len[i]+i>mx)
  33. 33 // {
  34. 34 // mx=Len[i]+i;
  35. 35 // id=i;
  36. 36 // int flag=0;
  37. 37 // if((Len[i]-1)%2)
  38. 38 // {
  39. 39 // if(Len[i]-1>=5)
  40. 40 // for(int j=i-4;j>j-Len[i];j-=2)
  41. 41 // {
  42. 42 // if(str[j]>str[j+2])
  43. 43 // {
  44. 44 // flag=1;
  45. 45 // break;
  46. 46 // }
  47. 47 // }
  48. 48 // }
  49. 49 // else
  50. 50 // {
  51. 51 // if(Len[i]-1>=4)
  52. 52 // for(int j=i-3;j>j-Len[i];j-=2)
  53. 53 // {
  54. 54 // if(str[j]>str[j+2])
  55. 55 // {
  56. 56 // flag=1;
  57. 57 // break;
  58. 58 // }
  59. 59 // }
  60. 60 // }
  61. 61 // if(!flag)
  62. 62 // sum=max(sum,Len[i]);
  63. 63 // }
  64. 64 // }
  65. 65 // return sum-1;
  66. 66 //}
  67. 67 //int main()
  68. 68 //{
  69. 69 // int t;
  70. 70 // scanf("%d",&t);
  71. 71 // while(t--)
  72. 72 // {
  73. 73 // memset(s,0,sizeof(s));
  74. 74 // scanf("%d",&len);
  75. 75 // for(int i=0;i<len;++i)
  76. 76 // scanf("%d",&s[i]);
  77. 77 // init();
  78. 78 // printf("%d\n",manacher());
  79. 79 // }
  80. 80 // return 0;
  81. 81 //}
  82. 82 #include<stdio.h>
  83. 83 #include<string.h>
  84. 84 #include<iostream>
  85. 85 #include<algorithm>
  86. 86 #include<set>
  87. 87 using namespace std;
  88. 88 const int maxn=300005;
  89. 89 const int INF=0x3f3f3f3f;
  90. 90 const int mod=998244353;
  91. 91 int str[maxn],s[maxn];
  92. 92 int len,Len[maxn];
  93. 93 void init()
  94. 94 {
  95. 95 memset(str,0,sizeof(str));
  96. 96 int k=0;
  97. 97 str[k++]=-1;
  98. 98 for(int i=0;i<len;++i)
  99. 99 str[k++]=0,str[k++]=s[i];
  100. 100 str[k++]=0;
  101. 101 len=k;
  102. 102 }
  103. 103 void manacher()
  104. 104 {
  105. 105 Len[0]=0;
  106. 106 int sum=0;
  107. 107 int id,mx=0;
  108. 108 for(int i=1;i<len;++i)
  109. 109 {
  110. 110 if(i<mx) Len[i]=min(mx-i,Len[2*id-i]);
  111. 111 else Len[i]=1;
  112. 112 int Min;
  113. 113 if(str[i] > 0) Min = str[i];
  114. 114 else Min = str[i + 1];
  115. 115 while(str[i - Len[i]] == str[i + Len[i]] && str[i - Len[i]] <= Min) {
  116. 116 //printf("are you here?\n");
  117. 117 if(str[i - Len[i]] > 0)
  118. 118 Min = str[i - Len[i]];
  119. 119 if(i + Len[i] > mx) {
  120. 120 mx = i + Len[i];
  121. 121 id = i;
  122. 122 }
  123. 123 Len[i]++;
  124. 124 }
  125. 125 }
  126. 126 int ans = 0;
  127. 127 for(int i = 1; i < len; i++) ans = max(ans, Len[i]);
  128. 128 printf("%d\n", ans - 1);
  129. 129 }
  130. 130 // if(Len[i]+i>mx)
  131. 131 // {
  132. 132 // mx=Len[i]+i;
  133. 133 // id=i;
  134. 134 // int flag=0;
  135. 135 // if((Len[i]-1)%2)
  136. 136 // {
  137. 137 // if(Len[i]-1>=5)
  138. 138 // for(int j=i-4;j>j-Len[i];j-=2)
  139. 139 // {
  140. 140 // if(str[j]>str[j+2])
  141. 141 // {
  142. 142 // flag=1;
  143. 143 // break;
  144. 144 // }
  145. 145 // }
  146. 146 // }
  147. 147 // else
  148. 148 // {
  149. 149 // if(Len[i]-1>=4)
  150. 150 // for(int j=i-3;j>i-Len[i];j-=2)
  151. 151 // {
  152. 152 // if(str[j]>str[j+2])
  153. 153 // {
  154. 154 // flag=1;
  155. 155 // break;
  156. 156 // }
  157. 157 // }
  158. 158 // }
  159. 159 // if(!flag)
  160. 160 // sum=max(sum,Len[i]);
  161. 161 // }
  162. 162 // }
  163. 163 // return (sum-1);
  164. 164 //}
  165. 165 int main()
  166. 166 {
  167. 167 int t;
  168. 168 scanf("%d",&t);
  169. 169 while(t--)
  170. 170 {
  171. 171 scanf("%d",&len);
  172. 172 for(int i=0;i<len;++i)
  173. 173 scanf("%d",&s[i]);
  174. 174 init();
  175. 175 manacher();
  176. 176 //printf("%d\n",);
  177. 177 }
  178. 178 return 0;
  179. 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. Head First 设计模式 —— 14. 复合 (Compound) 模式

    复合模式 在一个解决方案中结合两个或多个模式,以解决一般或重复发生的问题. P500 思考题 public interface Quackable { public void quack(); } p ...

  2. 终于可以愉快的撸Java异步代码了!

      异步响应式编程可以极大的提高系统的并发呑吐量,但由于Java没有类似于其他语言的Async/Await机制,所以只能通过CompletableFuture.thenXXX()来串联各个异步任务,这 ...

  3. ctfshow—web—web2

    打开靶机,根据提示是SQL注入 打开后看到登录窗口 方法一.手工注入 抓取数据包 开始SQL注入测试 利用万能密码,登录成功 查看回显位置 查询数据库 查询数据库内数据表 如果想整齐一点显示可以添加g ...

  4. EF Core 6.0的新计划

    今天,我们很兴奋地与你分享Entity Framework Core 6.0的计划. 这个计划汇集了许多人的意见,并概述了我们打算在哪里以及如何优化实体框架(EF Core) 6.0版本.这个计划并不 ...

  5. linux搭建简单samba服务器

    1.安装需要的软体 yum install -y samba samba-client samba-common 2.创建samba需要的本地用户,创建samba服务使用的目录 Linux系统文件的读 ...

  6. kubernetes之为每个命名空间的pod设置默认的requests以及limits

    一  为啥需要为命名空间里面添加pod添加默认的requests和limits? 通过前面的学习我们已经知道,如果节点上面的pod没有设置requests和limits,这些容器就会受那些设置了的控制 ...

  7. Java并发编程常识

    这是why的第 85 篇原创文章 写中间件经常要做两件事: 1.延迟加载,在内存缓存已加载项. 2.统计调用次数,拦截并发量. 就这么个小功能,团队里的人十有八九写错. 上面这句话不是我说的,是梁飞在 ...

  8. hook笔记①

    汇编中push 0x*** retn表示跳转到某个地址继续执行 取消hook时会在多线程环境中可能被检测 去掉函数框架可以规避寄存器cpu前后状态监测 #pragma comment(linker,& ...

  9. DevOps运动的缘起 将DevOps想象为一种编程语言里面的一个接口,而SRE类实现了这个接口

     SRE vs DevOps:是敌是友? - DockOne.io http://www.dockone.io/article/5935   RE vs DevOps:是敌是友? [编者的话]网站可靠 ...

  10. 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 ...