HDU 5371 (2015多校联合训练赛第七场1003)Hotaru's problem(manacher+二分/枚举)
题意:
定义一个序列为N序列:这个序列按分作三部分,第一部分与第三部分同样,第一部分与第二部分对称。
如今给你一个长为n(n<10^5)的序列,求出该序列中N序列的最大长度。
思路:
来自官方题解:修正了一些题解错别字(误
先用求回文串的Manacher算法。求出以第i个点为中心的回文串长度。记录到数组p中
要满足题目所要求的内容。须要使得两个相邻的回文串,共享中间的一部分,也就是说。左边的回文串长度的一半,要大于等于共享部分的长度,右边回文串也是一样。 由于我们已经记录下来以第i个点为中心的回文串长度, 那么问题能够转化成,相距x的两个数a[i],a[i+x],满足p[i]/2>=x 而且 p[i+x]/2>=x。要求x尽量大
这能够用一个set维护。一開始集合为空,依次取出p数组中最大的元素。将其下标放入set中,每取出一个元素,在该集合中二分查找比i+p[i]/2小,但最大的元素。更新ans。
然后查找集合中比i-p[i]/2大,但最小的元素,更新ans。
答案就是3*ans
嗯~事实上不用二分暴力扫下也能水过去
/*
* @author FreeWifi_novicer
* language : C++/C
*/
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#include<string>
#include<map>
#include<set>
#include<vector>
#include<queue>
using namespace std;
#define clr( x , y ) memset(x,y,sizeof(x))
#define cls( x ) memset(x,0,sizeof(x))
#define mp make_pair
#define pb push_back
typedef long long lint;
typedef long long ll;
typedef long long LL;
const int maxn = 100000 + 5;
int p[2*maxn];
int s[maxn];
int s1[2*maxn];
int n;
void init(){
cls(s1);
s1[0] = -1;
s1[1] = -2;
int k = 2;
for(int i = 0 ; i < n ; i++){
s1[k++] = s[i];
s1[k++] = -2;
}
}
void manacher(){
int mx = 0 , id = 0;
p[0] = 0;
for(int i = 0 ; i < 2*n+1 ; i++){
if(mx > i) p[i] = min(p[2*id-i] , mx-i);
else p[i] = 1;
while(s1[i-p[i]] == s1[i+p[i]]) p[i]++;
if(mx < p[i]+i){
mx = p[i] + i;
id = i;
}
}
}
int solve(){
int ans = 0;
for(int i = 1; i < n*2 + 1 ; i += 2)
if((p[i] - 1) / 2 > ans){
for(int j = i + p[i] - 1 ; ; j -= 2){
if(p[j] >= j-i){
ans = (j-i) / 2;
break;
}
if((j-i)/2 <= ans) break;
}
}
return 3*ans;
}
int main(){
//freopen("input.txt","r",stdin);
int t; cin >> t ; int kase = 1;
while(t--){
cls(s);cls(p);cls(s1);
cin >> n;
for(int i = 0 ; i < n ; i++){
scanf("%d",s+i);
}
init();
manacher();
printf("Case #%d: %d\n",kase++,solve());
}
return 0;
}
HDU 5371 (2015多校联合训练赛第七场1003)Hotaru's problem(manacher+二分/枚举)的更多相关文章
- HDU 5358(2015多校联合训练赛第六场1006) First One (区间合并+常数优化)
pid=5358">HDU 5358 题意: 求∑i=1n∑j=in(⌊log2S(i,j)⌋+1)∗(i+j). 思路: S(i,j) < 10^10 & ...
- hdu 5361 2015多校联合训练赛#6 最短路
In Touch Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) Total ...
- hdu 5381 The sum of gcd 2015多校联合训练赛#8莫队算法
The sum of gcd Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) T ...
- hdu 5358 First One 2015多校联合训练赛#6 枚举
First One Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) Tota ...
- 2015多校联合训练赛 hdu 5308 I Wanna Become A 24-Point Master 2015 Multi-University Training Contest 2 构造题
I Wanna Become A 24-Point Master Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 ...
- 2015多校联合训练赛hdu 5301 Buildings 2015 Multi-University Training Contest 2 简单题
Buildings Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) Tota ...
- 2015多校联合训练赛 Training Contest 4 1008
构造题: 比赛的时候只想到:前面一样的数,后面 是类似1,2,3,4,5,6....t这 既是:t+1,t+1...,1,2,3,...t t+1的数目 可能 很多, 题解时YY出一个N 然后对N ...
- hdu 5288||2015多校联合第一场1001题
pid=5288">http://acm.hdu.edu.cn/showproblem.php?pid=5288 Problem Description OO has got a ar ...
- HDU 5371(2015多校7)-Hotaru's problem(Manacher算法求回文串)
题目地址:HDU 5371 题意:给你一个具有n个元素的整数序列,问你是否存在这样一个子序列.该子序列分为三部分,第一部分与第三部分同样,第一部分与第二部分对称.假设存在求最长的符合这样的条件的序列. ...
随机推荐
- 常用模块re模块(正则表达式)
re模块 一:什么是正则? 正则就是用一些具有特殊含义的符号组合到一起(称为正则表达式)来描述字符或者字符串的方法.或者说:正则就是用来描述一类事物的规则.(在Python中)它内嵌在Python中, ...
- Spring Boot学习总结(2)——Spring Boot整合Jsp
怎么使用jsp上面起了疑问,查阅了多方资料,找到过其他人的博客的描述,也找到了spring在github上的给出的例子,看完后稍微改动后成功 整合jsp,于是决定将整合过程记载下来. 无论使用的是那种 ...
- 编译impala、拓展impala语法解析模块
以前也编译过,但是每次编译都忘记怎么做,然后都得重新找需要下载的文件. 编译文件:buildall.sh 如果想只编译前端可以这样运行: buildall.sh -fe_only 编译时会去S3下载一 ...
- HBase源代码分析之HRegion上MemStore的flsuh流程(二)
继上篇<HBase源代码分析之HRegion上MemStore的flsuh流程(一)>之后.我们继续分析下HRegion上MemStore flush的核心方法internalFlushc ...
- Linux能ping通IP,ping不通域名
今天碰到个问题, 能ping通IP地址, ping不通域名, 一直以为是 DNS解析服务器的问题, 找了半天. 问题不在这里. [root@www postfix]# cat /etc/resolv. ...
- FTP配置说明
1.下载rpm包,如vsftpd-3.0.2-21.el7.x86_64.rpm.可在系统盘里面找到或者下载 2.参考如下步骤.或者见链接http://blog.csdn.net/uq_jin/art ...
- Ubuntu16.04+Gnome3 锁定屏幕快捷键无效解决办法
Ubuntu16.04 桌面环境通过Ubuntu server和后安装的Gnome3 桌面环境实现,安装完以后发现锁定屏幕快捷键无效,系统设置=>键盘=>快捷中 锁屏快捷键已经存在Supe ...
- VS Code在本地进行调试和打开本地服务器
进行本地调试 1.在扩展中搜索插件 Debugger for Chrome 进行安装.我已经进行了安装,就没有出现安装字样. 2.配置launch.json文件,根据步骤来.file就是你在浏览器中需 ...
- 推荐《机器学习实战:基于Scikit-Learn和TensorFlow》高清中英文PDF+源代码
探索机器学习,使用Scikit-Learn全程跟踪一个机器学习项目的例子:探索各种训练模型:使用TensorFlow库构建和训练神经网络,深入神经网络架构,包括卷积神经网络.循环神经网络和深度强化学习 ...
- Docker中运行MySQL5.7并挂载宿主机目录到镜像
原文:Docker中运行MySQL5.7并挂载宿主机目录到镜像 1.1 拉取mysql镜像 docker pull mysql:5.7 1.2 创建用于挂载的目录 mkdir -p /data/mys ...