BZOJ2565:最长双回文串
浅谈\(Manacher\):https://www.cnblogs.com/AKMer/p/10431603.html
题目传送门:https://www.lydsy.com/JudgeOnline/problem.php?id=2565
统计一下每个点做靠左的能覆盖它的回文串中心\(left_i\)和最靠右的能覆盖它的回文串中心\(right_i\)即可。
每次用#的\(right_i-left_i\)直接更新答案就行。
对于每个回文串中心,在\(i-p_i+1\)处的\(right\)与自己取一个\(max\),在\(i+p_i-1\)处与自己取\(min\)。然后倒着枚举更新\(left\)为后缀最小值,正着枚举更新\(right\)为前缀最大值即可。
注意更新答案的时候要判断当前点是否与自己的\(left\)和\(right\)都不相等,相等就不是双回文了。
时间复杂度:\(O(n)\)
空间复杂度:\(O(n)\)
代码如下:
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn=2e5+5;
int n,ans;
char s[maxn];
int p[maxn],left[maxn],right[maxn];
int read() {
	int x=0,f=1;char ch=getchar();
	for(;ch<'0'||ch>'9';ch=getchar())if(ch=='-')f=-1;
	for(;ch>='0'&&ch<='9';ch=getchar())x=x*10+ch-'0';
	return x*f;
}
int main() {
	scanf("%s",s+1);
	n=strlen(s+1);
	for(int i=n;i;i--)
		s[i<<1]=s[i],s[(i<<1)-1]='#';
	s[0]='$',s[n<<1|1]='#',n=n<<1|1;
	memset(left,63,sizeof(left));
	int id=0,mx=0;
	for(int i=1;i<=n;i++) {
		p[i]=i<=mx?min(mx-i+1,p[(id<<1)-i]):1;
		while(s[i-p[i]]==s[i+p[i]])p[i]++;
		if(i+p[i]-1>mx)id=i,mx=i+p[i]-1;
		int pos=i-p[i]+1;right[pos]=max(right[pos],i);
		pos=i+p[i]-1;left[pos]=min(left[pos],i);
	}
	for(int i=1;i<=n;i++)right[i]=max(right[i-1],right[i]);
	for(int i=n;i;i--)left[i]=min(left[i],left[i+1]);
	for(int i=1;i<=n;i+=2)
		if(right[i]!=i&&left[i]!=i)
			ans=max(ans,right[i]-left[i]);
	printf("%d\n",ans);
	return 0;
}
BZOJ2565:最长双回文串的更多相关文章
- BZOJ2565 最长双回文串 【Manacher】
		BZOJ2565 最长双回文串 Description 顺序和逆序读起来完全一样的串叫做回文串.比如acbca是回文串,而abc不是(abc的顺序为"abc",逆序为"c ... 
- BZOJ2565最长双回文串——manacher
		题目描述 顺序和逆序读起来完全一样的串叫做回文串.比如acbca是回文串,而abc不是(abc的顺序为“abc”,逆序为“cba”,不相同).输入长度为n的串S,求S的最长双回文子串T,即可将T分为两 ... 
- BZOJ2565:最长双回文串(Manacher)
		Description 顺序和逆序读起来完全一样的串叫做回文串.比如acbca是回文串,而abc不是(abc的顺序为“abc”,逆序为“cba”,不相同). 输入长度为n的串S,求S的最长双回文子串T ... 
- p4555&bzoj2565 最长双回文串
		传送门(洛谷) 传送门(bzoj) 题目 顺序和逆序读起来完全一样的串叫做回文串.比如acbca是回文串,而abc不是(abc的顺序为abc,逆序为cba,不相同). 输入长度为 nnn 的串 SSS ... 
- BZOJ2565: 最长双回文串(Manacher)
		Description 顺序和逆序读起来完全一样的串叫做回文串.比如acbca是回文串,而abc不是(abc的顺序为“abc”,逆序为“cba”,不相同).输入长度为n的串S,求S的最长双回文子串T, ... 
- bzoj2565: 最长双回文串 pam
		题意:找一个串中的最长连续两个回文子串长度 题解:建两个回文树,一个正着,一个反着,每次add之后last的长度就是后缀最长的回文串长度,然后两边加一遍即可 /******************** ... 
- bzoj千题计划305:bzoj2565: 最长双回文串(回文自动机)
		https://www.lydsy.com/JudgeOnline/problem.php?id=2565 正着构造回文自动机 倒过来再构造一个回文自动机 分别求出以位置i开始的和结尾的最长回文串 # ... 
- 2019.03.02 bzoj2565: 最长双回文串(pam)
		传送门 题意简述:问最长的由两个回文串连接而成最长字串长度. 思路: 正反串各建一个pampampam然后就完了. 代码: #include<bits/stdc++.h> #define ... 
- BZOJ2565: 最长双回文串(回文树)
		题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2565 记录一下每个点往前最长延伸位置,正反两遍,枚举分割点. #include<cstr ... 
- bzoj2565: 最长双回文串
		manacher之后乱搞 #include <iostream> #include <cstdio> #include <cstring> #include < ... 
随机推荐
- 玩转python主题模型程序库gensim
			gensim是python下一个极易上手的主题模型程序库(topic model),网址在:http://radimrehurek.com/gensim/index.html 安装过程较为繁琐,参考h ... 
- 混淆Android JAR包的方法
			http://blog.csdn.net/vurtne_ye/article/details/35599491 1)导出jar包 如何在eclipse上Android工程中导出jar包?google, ... 
- SOA 面向服务架构 阅读笔记(四)
			15 SOA管理 15.1 管理指的是实现一个制约和平衡的一致过程,以确保得到期望的结果. 15.2 管理被广泛应用于人工流程和软件流程中,一旦管理失败,后果会非常严重. 15.3 SOA管理的首要 ... 
- bowtie2用法
			bowtie2的功能:短序列的比对 用法:bowtie2 [options]* -x <bt2-idx> {-1 <m1> -2 <m2> | -U <r&g ... 
- mini2440移植uboot 2014.04(六)
			上一篇博文:<mini2440移植uboot 2014.04(五)> 代码已经上传到github上:https://github.com/qiaoyuguo/u-boot-2014.04- ... 
- Python中的条件选择和循环语句
			一.条件选择语句 Python中条件选择语句的关键字为:if .elif .else这三个.其基本形式如下: if condition: block elif condition: block ... ... 
- linux设置系统时间与时区以及设置bios时间同步系统时间
			有装过Linux系统的人,可能都会有这样的经历,就是该机器安装windows系统时,时间正确,但是安装了linux系统后,尽管时区选择正确,也会发现系统时间不对.这是由于安装系统时采用了UTC,那么什 ... 
- iptable防火墙面试题
			第1章 (一)基础口试题 1.1 详述 iptales 工作流程以及规则过滤顺序? 1.防火墙是一层层过滤的.实际是按照配置规则的顺序从上到下,从前到后进行过滤的. 2.如果匹配上了规则,即明确表明是 ... 
- oracle 字典表查询
			1.oracle 字典表查询 /*显示当前用户*/ show user 在sql plus中可用,在pl sql中不可用 /*查看所有用户名*/ select username,user_id,cre ... 
- spark学习1(hadoop集群搭建)
			把原先搭建的集群环境给删除了,自己重新搭建了一次,将笔记整理在这里,方便自己以后查看 第一步:安装主节点spark1 第一个节点:centos虚拟机安装,全名spark1,用户名hadoop,密码12 ... 
