HDU5384-Hotaru's problem-Manacher
找出紧挨的三个回文串,例如abccbaabc ,形如ABA格式,其中AB为回文串。计算最长的长度。
首先用Manacher处理回文半径。然后就是找到两个点,都是偶数的回文串,并且共享了中间一段。
之后拿set搞一下就可以了= =
#include <set>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue> using namespace std; const int maxn = 1e5+;
int Ma[maxn<<],Mp[maxn<<];
set <int> pos; struct node{
int mp,p;
node(){}
bool operator < (const node &rhs) const
{
if(mp == rhs.mp) return p > rhs.p;
else return mp < rhs.mp;
}
}; priority_queue<node> pq;
void Manacher(int s[],int len)
{
int l = ;
Ma[l++] = '$';
Ma[l++] = '#';
for(int i=;i<len;i++)
{
Ma[l++] = s[i];
Ma[l++] = '#';
}
Ma[l] = ;
int mx = ,id = ;
for(int i=;i<l;i++)
{
Mp[i] = mx > i? min(Mp[*id-i],mx-i) : ;
while(Ma[i + Mp[i]] == Ma[i-Mp[i]]) Mp[i]++;
if(Mp[i] + i > mx)
{
mx = Mp[i] + i;
id = i;
}
}
} int T,N;
int save[maxn];
int main()
{
scanf("%d",&T);
int cas = ;
while(T--)
{
scanf("%d",&N);
for(int i=;i<N;i++) scanf("%d",&save[i]);
Manacher(save,N);
int ans = ;
node tmp;
while(!pq.empty()) pq.pop();
pos.clear();
for(int i=;i<*N+;i++)
{
if(Ma[i] == '#' && Mp[i] > )
{
tmp.mp = Mp[i];
tmp.p = i;
pq.push(tmp);
}
}
int cnt = ;
//for(int i=0;i<2*N+1;i++) printf("%d\t",i); puts("");
//for(int i=0;i<2*N+1;i++) printf("%c\t",Ma[i]=='#'?'#':Ma[i]+'0'); puts("");
//for(int i=0;i<2*N+1;i++) printf("%d\t",Mp[i]); puts("");
while(!pq.empty())
{
tmp = pq.top(); pq.pop();
int cur = tmp.p,mp = tmp.mp;
//printf("cur:%d mp:%d\n",cur,mp);
int tmp_pos = ;
if(cnt)
{
auto it = pos.lower_bound(cur - (mp-) ); //printf("L:%d ",*it);
if(it != pos.end() && *it >= cur-(mp-)) ans = max(ans,cur-*it); it = pos.lower_bound(cur + (mp-) ); it--;
//printf("R:%d\n",*it);
if(it != pos.end() && *it <= cur+(mp-)) ans = max(ans,*it-cur);
}
pos.insert(cur);
cnt++;
}
printf("Case #%d: %d\n",++cas,ans/*);
}
}
HDU5384-Hotaru's problem-Manacher的更多相关文章
- Hdu 5371 Hotaru's problem (manacher+枚举)
题目链接: Hdu 5371 Hotaru's problem 题目描述: 给出一个字符串N,要求找出一条N的最长连续子串.这个子串要满足:1:可以平均分成三段,2:第一段和第三段相等,3:第一段和第 ...
- HDU 5371 Hotaru's problem Manacher+尺取法
题意:给你一个序列,求最长的两段回文子串,要求他们共用中间的一半. 思路:利用Manacher求出p[i]表示的当前位置的最长回文串长度,然后把每一个长度大于等于2的回文串的左区间和右区间分别放到两个 ...
- HDU 5371——Hotaru's problem——————【manacher处理回文】
Hotaru's problem Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) ...
- Manacher HDOJ 5371 Hotaru's problem
题目传送门 /* 题意:求形如(2 3 4) (4 3 2) (2 3 4)的最长长度,即两个重叠一半的回文串 Manacher:比赛看到这题还以为套个模板就行了,因为BC上有道类似的题,自己又学过M ...
- Hotaru's problem
Hotaru's problem Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) ...
- [2015hdu多校联赛补题]hdu5371 Hotaru's problem
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5371 题意:把一个数字串A翻过来(abc翻过来为cba)的操作为-A,我们称A-AA这样的串为N-se ...
- 2015 Multi-University Training Contest 7 hdu 5371 Hotaru's problem
Hotaru's problem Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) ...
- HDU 5371 Hotaru's problem (Manacher,回文串)
题意:给一个序列,找出1个连续子序列,将其平分成前,中,后等长的3段子序列,要求[前]和[中]是回文,[中]和[后]是回文.求3段最长为多少?由于平分的关系,所以答案应该是3的倍数. 思路:先Mana ...
- HDU 5371 Manacher Hotaru's problem
求出一个连续子序列,这个子序列由三部分ABC构成,其中AB是回文串,A和C相同,也就是BC也是回文串. 求这样一个最长的子序列. Manacher算法是在所有两个相邻数字之间插入一个特殊的数字,比如- ...
- HDU 5371(2015多校7)-Hotaru's problem(Manacher算法求回文串)
题目地址:HDU 5371 题意:给你一个具有n个元素的整数序列,问你是否存在这样一个子序列.该子序列分为三部分,第一部分与第三部分同样,第一部分与第二部分对称.假设存在求最长的符合这样的条件的序列. ...
随机推荐
- 性能调优3:硬盘IO性能
数据库系统严重依赖服务器的资源:CPU,内存和硬盘IO,通常情况下,内存是数据的读写性能最高的存储介质,但是,内存的价格昂贵,这使得系统能够配置的内存容量受到限制,不能大规模用于数据存储:并且内存是易 ...
- FreeBSD常用操作
导读 最近遇到一些FreeBSD的故障,在这种操作系统上我们平时用的一些命令无法执行,FreeBSD的一些配置文件也和其他很多Linux系统不一样.为了方便以后查阅,我特别整理了这篇文档. 1. 网络 ...
- echarts x轴 增加滚动条
charts x轴 增加滚动条 在option 配置项中添加 [ dataZoom 中配置 ] 设置x轴滚动条 效果图: 动态拖动 以下参考代码 dataZoom配置 官网写法 option = { ...
- Linux之磁盘挂载
1.查看磁盘分区情况: fdisk -l 可以看到,红框中的硬盘没有分区. 2.开始分区: fdisk /dev/vdb 3.格式化分区: mkfs.xfs 分区名 4.挂载磁盘 挂载方式1: 手动挂 ...
- cent6.x配置主机名及静态网络
# 修改网卡名为NAME="eth0" [root@jenkins ~]# -persistent-net.rules # This file was automatically ...
- myecplise ssh项目配置上遇到的问题
版本:spring3.1+hib4.1+struts2.1 学习项目使用此版本运行时,总是会遇到各样的错误,在这里做一下记录. 问题1:log4j相关 spring的web项目,执行时报错: 信息: ...
- Day3-2 函数之递归
递归 定义:一个函数在 内部调用自己,就称为递归. # 如何让10不停的除以2,直到不能除为止. n = 10 while True: n = int(n /2) print(n) if n == 0 ...
- NIO和经典IO
NIO未必更快,在Linux上使用Java6完成的测试中,多线程经典I/O设计胜出NIO30%左右 异步I/O强于经典I/O:服务器需要支持超大量的长期连接,比如10000个连接以上,不过各个客户端并 ...
- vue.js2.0:如何搭建开发环境及构建项目
1,安装node.js Node.js官网:https://nodejs.org/en/ 进入Node.js官网,选择下载并安装Node.js.安装过程只需要点击“下一步”即可, 如下图,非常简单. ...
- scrapy 项目搭建
安装好scrapy后,开始创建项目 项目名:zhaopin 爬虫文件名:zhao 1:cmd -- scrapy startproject zhaopin 2:cd zhaopin,进入项目目 ...