p4555&bzoj2565 最长双回文串
题目
顺序和逆序读起来完全一样的串叫做回文串。比如acbca
是回文串,而abc
不是(abc
的顺序为abc
,逆序为cba
,不相同)。
输入长度为 nnn 的串 SSS ,求 SSS 的最长双回文子串 TTT ,即可将 TTT 分为两部分 XXX , YYY ,( ∣X∣,∣Y∣≥1|X|,|Y|≥1∣X∣,∣Y∣≥1 )且 XXX 和 YYY 都是回文串。
输入格式:
一行由小写英文字母组成的字符串 SSS 。
输出格式:
一行一个整数,表示最长双回文子串的长度。
对于100%的数据,2≤|S|≤10^5
分析
运用manacher算法,在找以i为中心的最长回文串的同时不断更新此串所覆盖点的str和end,即以某点为第一个点的最长回文串长度和以某点为最后一个点的最长回文串长度,最后某点的双回文串的长度有两种情况:
1.如果该字符是后加的‘$’则长度为str[i]+end[i]
2.如果该字符原本就存在则长度为str[i]+end[i]-1
代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cctype>
#include<cmath>
#include<cstdlib>
#include<queue>
#include<ctime>
#include<vector>
#include<set>
#include<map>
#include<stack>
using namespace std;
int len1,len2;
char s1[310000],s2[310000];
int end[310000],str[310000],p[310000];
void init(){
s2[0]='#';
s2[1]='$';
for(int i=0;i<len1;i++){
s2[i*2+2]=s1[i];
s2[i*2+3]='$';
}
len2=len1*2+2;
s2[len2]='@';
}
void horsewithcar(){
int maxn=0,id=0;
for(int i=1;i<len2;i++){
if(maxn>i)p[i]=min(p[id*2-i],maxn-i);
else p[i]=1;
for(;s2[i+p[i]]==s2[i-p[i]];p[i]++){
if(i+p[i]>maxn){
maxn=i+p[i];
id=i;
}
str[i-p[i]]=max(str[i-p[i]],p[i]);
end[i+p[i]]=max(end[i+p[i]],p[i]);
}
}
}
int main()
{ int n,m,i,j,k;
scanf("%s",s1);
len1=strlen(s1);
init();
horsewithcar();
int maxn=0;
for(i=1;i<=len2;i++)
if(s2[i]=='$')maxn=max(maxn,str[i]+end[i]);
else maxn=max(maxn,str[i]+end[i]-1);
cout<<maxn<<endl;
return 0;
}
p4555&bzoj2565 最长双回文串的更多相关文章
- BZOJ2565 最长双回文串 【Manacher】
BZOJ2565 最长双回文串 Description 顺序和逆序读起来完全一样的串叫做回文串.比如acbca是回文串,而abc不是(abc的顺序为"abc",逆序为"c ...
- 【洛谷P4555】最长双回文串
题目大意:给定一个长度为 N 的字符串 S,求 S 的最长双回文子串的长度,双回文子串定义为是 S 的一个子串,可以分成两个互不相交的回文子串. 题解:利用回文自动机 len 数组的性质,即:len ...
- BZOJ2565最长双回文串——manacher
题目描述 顺序和逆序读起来完全一样的串叫做回文串.比如acbca是回文串,而abc不是(abc的顺序为“abc”,逆序为“cba”,不相同).输入长度为n的串S,求S的最长双回文子串T,即可将T分为两 ...
- BZOJ2565:最长双回文串(Manacher)
Description 顺序和逆序读起来完全一样的串叫做回文串.比如acbca是回文串,而abc不是(abc的顺序为“abc”,逆序为“cba”,不相同). 输入长度为n的串S,求S的最长双回文子串T ...
- 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 ...
随机推荐
- js之语句的一些需要注意的事情
1.delete运算符是用来删除一个对象的 属性,但有一点需要注意:使用var声明的变量虽为全局变量,单不是全局对象的属性,不可以用delete删除,而不用var直接声明的全局变量而直接赋值的为全局对 ...
- Please enable network time synchronisation in system settings
eth区块同步出现这样的WARN: WARN [06-17|13:02:42] System clock seems off by -51.509894715s, which can prevent ...
- 【leetcode刷题笔记】Combination Sum II
Given a collection of candidate numbers (C) and a target number (T), find all unique combinations in ...
- 常量池、perm(持久代)、方法区、栈
常量池.perm(持久代).方法区.栈 常量池指的是在编译期被确定,并被保存在已编译的.class文件中的一些数据. 除了包含代码中所定义的各种基本类型(如:int.long等等)和对象型(如St ...
- sqoop job 增量导入
使用sqoop job做增量导入 在执行导入模式为 incremental 的sqoop job 时,sqoop会获取上次导入操作的 –check-column的value值,也就是说使用sqoop ...
- kreuz-frankfurt-sample-generic-2019-02-08.xodr文件解读
第1行:xml语法所遵循的版本. L2:文件封装标记. L3:Opendrive的主要修订编号 次要修订编号 供应商. L4:记录有关地理参考坐标系的参数,投影-横轴墨卡托 a-地球椭球长半 ...
- Fireworks(whole page)
<!DOCTYPE HTML> <html> <head> <title>Canvas 实现放烟花特效</title> <meta c ...
- Queue 输出数据
坑人的引用类型....输出看看结果是什么 Queue<ParaInfo> strStranList = new Queue<ParaInfo>(); StringBuilder ...
- Jenkins部署及邮箱配置
第一步:下载jenkins安装包,下载地址是https://jenkins.io/download/,下载通用的war文件即可,这个格式文件不论哪个操作系统都可运行: 第二步:jdk安装,最新的jen ...
- PL/SQL学习笔记_02_游标
在 PL/SQL 程序中,对于处理多行记录的事务经常使用游标来实现. 为了处理 SQL 语句, ORACLE 必须分配一片叫上下文( context area )的区域来处理所必需的信息,其中包括要处 ...