【BZOJ】2342: [Shoi2011]双倍回文(Manacher)
题目
传送门:QWQ
分析
(sb如我写了发不知道什么东西在洛谷上竟然水了84分
嗯咳
设$ i $为双重回文的中心
如果$ j~i $ 可以被算作答案,只有满足如下两式:
- $ p[j]+j \geq i $
- $ 2*(i-j) \leq p[j] $
计算时我们先做一次马拉车,然后按照 $ p[j]+j \geq i $排序,保证它的单调,接着把满足$ 2*(i-j) \leq p[j] $扔进set里询问。
代码
#include <bits/stdc++.h>
using namespace std;
const int maxn=;
char s2[maxn],s[ maxn];
int p[ maxn], len;
set<int> t;
void Manacher(){
len=strlen(s2+);
for(int i=;i<=len;i++){
s[i*-]='#'; s[i*]=s2[i];
}
s[len=len*+]='#';
int right=, pos=;
for(int i=;i<=len;i++){
if(i<right){ p[i]=min(p[*pos-i],right-i); } else p[i]=;
while(i+p[i]<=len &&i-p[i]> && s[i+p[i]]==s[i-p[i]]) p[i]++;
if(i+p[i]>right){
right=i+p[i]; pos=i;
}
}
}
int q[maxn], f[maxn];
bool cmp(int a,int b){ return (a-f[a])<(b-f[b]); }
int main(){
int n;
scanf("%d%s",&n,s2+);
Manacher();
for(int i=;i<=n;i++) q[i]=i, f[i]=(p[i*+]-)/;
sort(q+,q++n,cmp);
int now=,ans=;
for(int i=;i<=n;i++){
while(now<=n&&q[now]-f[q[now]]<=i) {
t.insert(q[now]);
now++;
}
set<int>::iterator tmp=t.upper_bound(i+f[i]/);
if(tmp!=t.begin ()){
ans=max(ans,(*--tmp - i));
}
}
printf("%d\n",ans*);
return ;
}
/*
17
qwertyuaabbaabbaa
*/
【BZOJ】2342: [Shoi2011]双倍回文(Manacher)的更多相关文章
- bzoj 2342: [Shoi2011]双倍回文 -- manacher
2342: [Shoi2011]双倍回文 Time Limit: 10 Sec Memory Limit: 128 MB Description Input 输入分为两行,第一行为一个整数,表示字符 ...
- BZOJ 2342: [Shoi2011]双倍回文 [Manacher + set]
题意: 求最长子串使得它有四个相同的回文串SSSS相连组成 枚举中间x 找右边的中间y满足 y-r[y]<=x y<=x+r[x]/2 用个set维护 注意中间只能是# #include ...
- 2018.06.30 BZOJ 2342: [Shoi2011]双倍回文(manacher)
2342: [Shoi2011]双倍回文 Time Limit: 10 Sec Memory Limit: 128 MB Description Input 输入分为两行,第一行为一个整数,表示字符串 ...
- BZOJ 2342: [Shoi2011]双倍回文 马拉车算法/并查集
2342: [Shoi2011]双倍回文 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1123 Solved: 408 题目连接 http://w ...
- Manacher || BZOJ 2342: [Shoi2011]双倍回文 || Luogu P4287 [SHOI2011]双倍回文
题面:[SHOI2011]双倍回文 题解:具体实现时,就是在更新mr时维护前半段是回文串的最长回文串就好了 正确性的话,因为到i时如果i+RL[i]-1<=mr,那么答案肯定在i之前就维护过了: ...
- BZOJ 2342 [Shoi2011]双倍回文(manacher+并查集)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2342 [题目大意] 记Wr为W串的倒置,求最长的形如WWrWWr的串的长度. [题解] ...
- BZOJ 2342 [SHOI2011]双倍回文 (回文自动机)
题目大意:略 先建出$PAM$ 因为双倍回文串一定是4的倍数,所以找出$PAM$里所有$dep$能整除4的节点 看这个串是否存在一个回文后缀,长度恰好为它的一半,沿着$pre$链往上跳就行了 暴跳可能 ...
- BZOJ 2342 [Shoi2011]双倍回文(Manacher)
题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=2342 题意:求最长子串使得它有四个相同的回文串SSSS相连组成. 首先跑一边Manach ...
- bzoj 2342 [Shoi2011]双倍回文(manacher,set)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2342 [题意] 求出形如w wR w wR的最长连续子串. [思路] 用manache ...
- BZOJ 2342 [Shoi2011]双倍回文(manacher+堆+set)
题意 N<=500000 题解 维护一个set可以用堆来解决. #include<iostream> #include<cstring> #include<cstd ...
随机推荐
- Linux系统中DHCP的配置
DHCP为动态主机配置协议,负责IP地址的动态分配(当一个主机的IP为自动,则不需要自己写IP,他会在DHCP服务器的范围内自动获取) 在真机或虚拟机下配置DHCP服务时,需要先下载dhcp软件,使用 ...
- mysql在innodb索引下b+树的高度问题。
B+树索引介绍 B+树索引的本质是B+树在数据库中的实现.但是B+树索引有一个特点是高扇出性,因此在数据库中,B+树的高度一般在2到3层.也就是说查找某一键值的记录,最多只需要2到3次IO开销.按磁盘 ...
- save the transient instance before flushing错误解决办法 【待完善】
近日在项目中遇到以下错误,着实郁闷了一把: org.hibernate.TransientObjectException: object references an unsaved transient ...
- BZOJ1001 BeiJing2006 狼抓兔子 【网络流-最小割】*
BZOJ1001 BeiJing2006 狼抓兔子 Description 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的,而且现在的兔子还比较 ...
- 几种设置UITableView的cell动态高度的方法
1.UITableView加载的顺序是先得到表的行的高度,也就是先调用heightForRowAtIndexPath方法,然后再调用cellForRowAtIndexPath,所以我们有两个办法实现自 ...
- BestCoder Round #1 第一题 逃生
// 等了好久,BESTCODER 终于出来了..像咋这样的毕业的人..就是去凑凑热闹// 弱校搞acm真是难,不过还是怪自己不够努力// 第一题是明显的拓扑排序,加了了个字典序限制而已// 用优先队 ...
- Open Asset Import Library(assimp) vs2010编译
Assimp(Open Asset Import Library)是一个开源的3D模型导入解析库, 可以处理很多种3D文件格式:Collada, Blend, Obj, X, 3DS, LWO, MD ...
- JavaScript for 循环累加 json 字符串
var msg = {"status":1,"data":[{"id":"12","words":& ...
- 《DSP using MATLAB》示例Example7.24
代码: ws1 = 0.2*pi; wp1 = 0.35*pi; wp2 = 0.65*pi; ws2 = 0.8*pi; Rp = 1.0; As = 60; [delta1, delta2] = ...
- gradle java 简单项目使用
预备环境 gradle 配置好变量,方便生成项目 1. 环境配置 gradle wrapper 生成项目结构 ├── build.gradle ├── gradle │ └── wrapper │ ├ ...