题目链接http://acm.hdu.edu.cn/showproblem.php?pid=4513

Problem Description
  吉哥又想出了一个新的完美队形游戏!
  假设有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
  请输出能组成完美队形的最多人数,每组输出占一行。
 
思路:
1.要求选出的人在原队列中连续且想对顺序不变,即连续的子串。
2.该连续的子串中,左右对称,即连续回文子串。
3.限制条件:选出的队列呈现“凸字形”
4.最长,到此题意清晰,发现可以用mannacher算法来写,只是要注意在求解p[]数组时要加上题目限制条件。
代码:
 #include<stdio.h>
#include<algorithm>
#include<string.h>
#define mem(a, b) memset(a, b, sizeof(a))
using namespace std;
const int MAXN = 1e5 + ;
const int inf = 0x3f3f3f3f; int n;
int a[MAXN], s[ * MAXN], len, p[ * MAXN]; void get_s() //为了避免因 奇数偶数长度的串 引起的讨论,直接构造新的数列
{
s[] = -inf;
s[] = -;
len = ;
for(int i = ; i <= n; i ++)
{
s[++ len] = a[i];
s[++ len] = -;
}
s[++ len] = inf; //防止越界 s[0] 与 s[len]必须不相同
} int mannacher()
{
int mx = , id = , maxlen = -;
mem(p, ); //每个点的最长回文半径初始化为 0
for(int i = ; i < len; i ++) //除去了边界
{
if(i < mx)//先获取该点的回文半径当前最长长度 待更新
p[i] = min(p[id - (i - id)], mx - i);
else
p[i] = ;
while(s[i - p[i]] == s[i + p[i]] && s[i - p[i]] <= s[i - p[i] + ]) //限制条件
p[i] ++;
if(i + p[i] > mx)
{
mx = i + p[i];
id = i;
}
maxlen = max(maxlen, p[i] - );
}
return maxlen;
} int main()
{
int T;
scanf("%d", &T);
while(T --)
{
scanf("%d", &n);
len = ;
for(int i = ; i <= n; i ++)
scanf("%d", &a[i]);
get_s();
int ans = mannacher();
printf("%d\n", ans);
}
return ;
}

mannacher

最新文章

  1. font-size 兼容问题
  2. pipedata3d User Guide
  3. 作业七:团队项目——Alpha版本冲刺阶段005
  4. 【AngularJS学习笔记】02 小杂烩及学习总结
  5. Java Hour 61 基础概念拾遗
  6. HIHO 线段树(单点)
  7. Oracle RAC中的投票算法
  8. unity多边形uv地图
  9. 局部内部类访问方法的参数和局部变量必须是final的
  10. [ZooKeeper.net] 1 模仿dubbo实现一个简要的http服务的注册 基于webapi
  11. CentOS 下搭建FTP服务器
  12. python采用 多进程/多线程/协程 写爬虫以及性能对比,牛逼的分分钟就将一个网站爬下来!
  13. DUMP101 企业级电商FE
  14. innerHTML的使用
  15. Angular ngRepea
  16. Git操作自动触发企业微信机器人webhook
  17. 339. Nested List Weight Sum
  18. &lt;转&gt;jmeter(一)基础介绍
  19. 【定制Android系统】Android O 在ROM中添加自己的 so 库(1)——Android.mk 与 Android.bp 的区别【转】
  20. java Arrays.asList 问题

热门文章

  1. springboot后端controller参数接收
  2. PHP mysqli_debug() 函数
  3. c++ 容器反转并且拷贝到一个新容器中
  4. mysql启动关闭脚本
  5. 【原创】FltGetFileNameInformation蓝屏分析
  6. 互联网IT当线上出现 bug 时,是怎么处理的?
  7. 通过.zip安装eclipse插件
  8. LDA线性分析推广到多分类
  9. PHP之Memcache和Memcached
  10. python 中对象is和==是怎么比较的