HDU 4513 吉哥系列故事――完美队形II (manacher算法+最长不下降)

本文主要是介绍HDU 4513 吉哥系列故事――完美队形II (manacher算法+最长不下降),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

吉哥系列故事——完美队形II

Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)
Total Submission(s): 5861    Accepted Submission(s): 2358


 

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

  请输出能组成完美队形的最多人数,每组输出占一行。

 

 

Sample Input

 

2 3 51 52 51 4 51 52 52 51

 

 

Sample Output

 

3 4

 

 

Source

2013腾讯编程马拉松初赛第二场(3月22日)

 

 

Recommend

liuyiding

 

分析:manacher算法的变形,manacher算法还是理解的不透彻,这题只需要在while判断里加一个st[i-Len[i]]<=st[i-Len[i]+2即可

因为当前我求的是以位置i为中心的最长回文长度,现在扩展到(i-Len[i],i+Len[i]),这个范围,如果不满足,到此为止即可。

#include<iostream>
#include<cstdio>
#include<string> 
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;const int maxn=1000010;
int str[maxn];//原字符串
int tmp[maxn<<1];//转换后的字符串
int Len[maxn<<1];
//转换原始串
int init(int st[],int len)///0代表#,头尾不一样即可
{int i;tmp[0]=-1;//字符串开头增加一个特殊字符,防止越界for(i=1;i<=2*len;i+=2){tmp[i]=0;tmp[i+1]=st[i/2];}tmp[2*len+1]=0;tmp[2*len+2]=-2;//字符串结尾加一个字符,防止越界return 2*len+1;//返回转换字符串的长度
}
//Manacher算法计算过程
int manacher(int st[],int len)
{int mx=0,ans=0,po=0;//mx即为当前计算回文串最右边字符的最大值for(int i=1;i<=len;i++){if(mx>i)Len[i]=min(mx-i,Len[2*po-i]);//在Len[j]和mx-i中取个小elseLen[i]=1;//如果i>=mx,要从头开始匹配while(st[i-Len[i]]==st[i+Len[i]]&&st[i-Len[i]]<=st[i-Len[i]+2])///字符串需要满足的条件Len[i]++;if(Len[i]+i>mx)//若新计算的回文串右端点位置大于mx,要更新po和mx的值{mx=Len[i]+i;po=i;}ans=max(ans,Len[i]);}return ans-1;//返回Len[i]中的最大值-1即为原串的最长回文子串额长度
}int main()
{int T;scanf("%d",&T);while(T--){int n;scanf("%d",&n);for(int i=0;i<n;i++){scanf("%d",&str[i]);}int l=init(str,n);printf("%d\n",manacher(tmp,l));}return 0;
}

 

这篇关于HDU 4513 吉哥系列故事――完美队形II (manacher算法+最长不下降)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/379392

相关文章

SpringBoot实现MD5加盐算法的示例代码

《SpringBoot实现MD5加盐算法的示例代码》加盐算法是一种用于增强密码安全性的技术,本文主要介绍了SpringBoot实现MD5加盐算法的示例代码,文中通过示例代码介绍的非常详细,对大家的学习... 目录一、什么是加盐算法二、如何实现加盐算法2.1 加盐算法代码实现2.2 注册页面中进行密码加盐2.

Java时间轮调度算法的代码实现

《Java时间轮调度算法的代码实现》时间轮是一种高效的定时调度算法,主要用于管理延时任务或周期性任务,它通过一个环形数组(时间轮)和指针来实现,将大量定时任务分摊到固定的时间槽中,极大地降低了时间复杂... 目录1、简述2、时间轮的原理3. 时间轮的实现步骤3.1 定义时间槽3.2 定义时间轮3.3 使用时

电脑提示找不到openal32.dll文件怎么办? openal32.dll丢失完美修复方法

《电脑提示找不到openal32.dll文件怎么办?openal32.dll丢失完美修复方法》openal32.dll是一种重要的系统文件,当它丢失时,会给我们的电脑带来很大的困扰,很多人都曾经遇到... 在使用电脑过程中,我们常常会遇到一些.dll文件丢失的问题,而openal32.dll的丢失是其中比较

使用DrissionPage控制360浏览器的完美解决方案

《使用DrissionPage控制360浏览器的完美解决方案》在网页自动化领域,经常遇到需要保持登录状态、保留Cookie等场景,今天要分享的方案可以完美解决这个问题:使用DrissionPage直接... 目录完整代码引言为什么要使用已有用户数据?核心代码实现1. 导入必要模块2. 关键配置(重点!)3.

Python实现html转png的完美方案介绍

《Python实现html转png的完美方案介绍》这篇文章主要为大家详细介绍了如何使用Python实现html转png功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 1.增强稳定性与错误处理建议使用三层异常捕获结构:try: with sync_playwright(

如何通过Golang的container/list实现LRU缓存算法

《如何通过Golang的container/list实现LRU缓存算法》文章介绍了Go语言中container/list包实现的双向链表,并探讨了如何使用链表实现LRU缓存,LRU缓存通过维护一个双向... 目录力扣:146. LRU 缓存主要结构 List 和 Element常用方法1. 初始化链表2.

golang字符串匹配算法解读

《golang字符串匹配算法解读》文章介绍了字符串匹配算法的原理,特别是Knuth-Morris-Pratt(KMP)算法,该算法通过构建模式串的前缀表来减少匹配时的不必要的字符比较,从而提高效率,在... 目录简介KMP实现代码总结简介字符串匹配算法主要用于在一个较长的文本串中查找一个较短的字符串(称为

通俗易懂的Java常见限流算法具体实现

《通俗易懂的Java常见限流算法具体实现》:本文主要介绍Java常见限流算法具体实现的相关资料,包括漏桶算法、令牌桶算法、Nginx限流和Redis+Lua限流的实现原理和具体步骤,并比较了它们的... 目录一、漏桶算法1.漏桶算法的思想和原理2.具体实现二、令牌桶算法1.令牌桶算法流程:2.具体实现2.1

最长公共子序列问题的深度分析与Java实现方式

《最长公共子序列问题的深度分析与Java实现方式》本文详细介绍了最长公共子序列(LCS)问题,包括其概念、暴力解法、动态规划解法,并提供了Java代码实现,暴力解法虽然简单,但在大数据处理中效率较低,... 目录最长公共子序列问题概述问题理解与示例分析暴力解法思路与示例代码动态规划解法DP 表的构建与意义动

关于最长递增子序列问题概述

《关于最长递增子序列问题概述》本文详细介绍了最长递增子序列问题的定义及两种优化解法:贪心+二分查找和动态规划+状态压缩,贪心+二分查找时间复杂度为O(nlogn),通过维护一个有序的“尾巴”数组来高效... 一、最长递增子序列问题概述1. 问题定义给定一个整数序列,例如 nums = [10, 9, 2