BZOJ 2342 [Shoi2011]双倍回文(manacher+并查集)
【题目链接】 http://www.lydsy.com/JudgeOnline/problem.php?id=2342
【题目大意】
记Wr为W串的倒置,求最长的形如WWrWWr的串的长度。
【题解】
我们发现要找到这样一个双倍回文,我们可以采取在大的回文串中寻找小的回文串的方式,
在回文串i中找到回文串j满足j+r[j]>=i那么(i-j)<<1就可以用来更新答案。
在查找过程中,我们发现在下标小的i中无法被用到的j在下标大的i中也无法被用到,
因此对于无效的查找区间我们用并查集进行优化
【代码】
#include <cstdio>
#include <algorithm>
using namespace std;
const int N=500010;
int n,f[N<<1],r[N<<1],ans;
char s[N],c[N<<1];
void manacher(){
for(int i=1;i<=n;i++)c[i<<1]=s[i],c[(i<<1)+1]='#';
c[1]='#';c[n<<1|1]='#';c[0]='&';c[(n+1)<<1]='$';
int j=0,k; n=n<<1|1;
for(int i=1;i<=n;){
while(c[i-j-1]==c[i+j+1])j++;
r[i]=j;
for(k=1;k<=j&&r[i]-k!=r[i-k];k++)r[i+k]=min(r[i-k],r[i]-k);
i+=k;j=max(j-k,0);
}
}
int sf(int x){return f[x]==x?x:f[x]=sf(f[x]);}
int main(){
while(~scanf("%d",&n)){
scanf("%s",s+1);
manacher(); ans=0;
for(int i=1;i<=n;i++)f[i]=(c[i]=='#')?i:(i+1);
for(int i=3;i<n;i+=2){
int j=sf(max(i-(r[i]>>1),1));
for(;j<i&&j+r[j]<i;f[j]=sf(j+1),j=f[j]);
if(j<i)if((i-j)<<1>ans)ans=(i-j)<<1;
}printf("%d\n",ans);
}return 0;
}
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 ...
- 【BZOJ-2342】双倍回文 Manacher + 并查集
2342: [Shoi2011]双倍回文 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1799 Solved: 671[Submit][Statu ...
- Manacher || BZOJ 2342: [Shoi2011]双倍回文 || Luogu P4287 [SHOI2011]双倍回文
题面:[SHOI2011]双倍回文 题解:具体实现时,就是在更新mr时维护前半段是回文串的最长回文串就好了 正确性的话,因为到i时如果i+RL[i]-1<=mr,那么答案肯定在i之前就维护过了: ...
- BZOJ 2342 [SHOI2011]双倍回文 (回文自动机)
题目大意:略 先建出$PAM$ 因为双倍回文串一定是4的倍数,所以找出$PAM$里所有$dep$能整除4的节点 看这个串是否存在一个回文后缀,长度恰好为它的一半,沿着$pre$链往上跳就行了 暴跳可能 ...
- BZOJ 2342: [Shoi2011]双倍回文
Sol Manacher. 非常裸的Manacher啊...为什么有那么多人写Manacher+并查集?Set?Treap?...好神奇... 你只需要在 \(p[i]++\) 的位置加上判断就可以了 ...
- BZOJ 2342 [Shoi2011]双倍回文(Manacher)
题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=2342 题意:求最长子串使得它有四个相同的回文串SSSS相连组成. 首先跑一边Manach ...
随机推荐
- NightMare2(SCU4527+dijkstra+二分)
题目链接:http://acm.scu.edu.cn/soj/problem.action?id=4527 题目: 题意:最短路的每条边除了边权之外还会有一个限制(财富,身上带的财富大于这个值则不能通 ...
- Tomcat的安装以及基本配置
Tomcat是目前最常见也是最流行的基于java的一个web服务器软件 Tomcat的安装 (1)首先需要java环境,也就是说要依赖于java虚拟机JVM (2)下载Tomcat ,地址 ...
- 结合BeautyEye开源UI框架实现的较美观的Java桌面程序
BeautyJavaSwingRobot 结合BeautyEye开源UI框架实现的较美观的Java桌面程序,主要功能就是图灵机器人和一个2345网站万年历的抓取.... 挺简单而且实用的一个项目,实现 ...
- foreign key constraint fails错误的原因
建表:CREATE TABLE Course ( Cno Char(4) PRIMARY KEY, Cname Char(40), Cpno Char(4), Ccredit Int, FOREIGN ...
- Linux中断(interrupt)子系统之二:arch相关的硬件封装层【转】
转自:http://blog.csdn.net/droidphone/article/details/7467436 Linux的通用中断子系统的一个设计原则就是把底层的硬件实现尽可能地隐藏起来,使得 ...
- python实战===图片转换为字符的源码(转)
#cmd执行命令为>>> python xx.py pic.png#-*- coding:utf-8 -*- from PIL import Image import argpars ...
- Linux的SMP,UMA,NUMA
SMP 是Symmetric Multi-Processing的意思,对称多处理器,一种多核结构,认为这些核是完全同构的,任务可以随便在任一个核上跑. UMA是Uniform Memory Acces ...
- 【bzoj1072】SCOI2007排列
状压dp,f[i][j]表示当前取了i,模数余j的状态. 然后向后推,枚举可能的数即可. 注意每个数存在重复,最后要除以相应出现次数的阶乘. #include<bits/stdc++.h> ...
- 转载: GIt远程操作详解
Git远程操作详解 作者: 阮一峰 日期: 2014年6月12日 Git是目前最流行的版本管理系统,学会Git几乎成了开发者的必备技能. Git有很多优势,其中之一就是远程操作非常简便.本文详细介 ...
- 883H - Palindromic Cut(思维+STL)
题目链接:http://codeforces.com/problemset/problem/883/H 题目大意:给一段长度为n的字符串s,想让你把s切成几段长度相同的回文串,可以改变s中字符的排列, ...