【洛谷P4555】最长双回文串
题目大意:给定一个长度为 N 的字符串 S,求 S 的最长双回文子串的长度,双回文子串定义为是 S 的一个子串,可以分成两个互不相交的回文子串。
题解:利用回文自动机 len 数组的性质,即:len 数组记录的是以每个点 i 字符结尾的,向左可以延伸的,最长回文串的长度。正向遍历一遍串 S,统计出对于每个点向左可以延伸的最长回文长度,再将字符串翻转,统计出向右可以延伸的长度。最后枚举间断点,统计答案即可。
注:增量法回文自动机的插入依赖于字符串下标递增的顺序,因此倒序插入必须将原串转置。
代码如下
#include <bits/stdc++.h>
using namespace std;
const int maxn=1e5+10;
char s[maxn];
int n,ans,l[maxn],r[maxn];
struct PAM{
	int tot,last,trie[maxn][26],len[maxn],fail[maxn];
	PAM(){tot=1,fail[0]=fail[1]=1,len[1]=-1;}
	int insert(int c,int i){
		int p=last;
		while(s[i-len[p]-1]!=s[i])p=fail[p];
		if(!trie[p][c]){
			int now=++tot,k=fail[p];
			while(s[i-len[k]-1]!=s[i])k=fail[k];
			len[now]=len[p]+2,fail[now]=trie[k][c];
			trie[p][c]=now;
		}
		last=trie[p][c];
		return len[last];
	}
}pam_l,pam_r;
int main(){
	scanf("%s",s+1),n=strlen(s+1);
	for(int i=1;i<=n;i++)l[i]=pam_l.insert(s[i]-'a',i);
	reverse(s+1,s+n+1);
	for(int i=1;i<=n;i++)r[n-i+1]=pam_r.insert(s[i]-'a',i);
	for(int i=1;i<n;i++)ans=max(ans,l[i]+r[i+1]);
	printf("%d\n",ans);
	return 0;
}
												
											【洛谷P4555】最长双回文串的更多相关文章
- P4555 最长双回文串
		
题目描述 顺序和逆序读起来完全一样的串叫做回文串.比如acbca是回文串,而abc不是(abc的顺序为abc,逆序为cba,不相同). 输入长度为 n的串 S ,求 S的最长双回文子串 T ,即可将 ...
 - 洛谷 P4555 [国家集训队]最长双回文串 解题报告
		
P4555 [国家集训队]最长双回文串 题目描述 顺序和逆序读起来完全一样的串叫做回文串.比如acbca是回文串,而abc不是(abc的顺序为abc,逆序为cba,不相同). 输入长度为\(n\)的串 ...
 - 【洛谷】P4555 [国家集训队]最长双回文串
		
P4555 [国家集训队]最长双回文串 题源:https://www.luogu.com.cn/problem/P4555 原理:Manacher 还真比KMP好理解 解决最长回文串问题 转化为长度为 ...
 - P4555 [国家集训队]最长双回文串
		
P4555 [国家集训队]最长双回文串 manacher 用manacher在处理时顺便把以某点开头/结尾的最长回文串的长度也处理掉. 然后枚举. #include<iostream> # ...
 - Manacher || P4555 [国家集训队]最长双回文串 || BZOJ 2565: 最长双回文串
		
题面:P4555 [国家集训队]最长双回文串 题解:就.就考察马拉车的理解 在原始马拉车的基础上多维护个P[i].Q[i]数组,分别表示以i结尾最长回文子串的长度和以i开头的最长回文子串的长度 然后就 ...
 - BZOJ.2565.[国家集训队]最长双回文串(Manacher/回文树)
		
BZOJ 洛谷 求给定串的最长双回文串. \(n\leq10^5\). Manacher: 记\(R_i\)表示以\(i\)位置为结尾的最长回文串长度,\(L_i\)表示以\(i\)开头的最长回文串长 ...
 - BZOJ 2565: 最长双回文串 [Manacher]
		
2565: 最长双回文串 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1842 Solved: 935[Submit][Status][Discu ...
 - 【BZOJ2565】最长双回文串(回文树)
		
[BZOJ2565]最长双回文串(回文树) 题面 BZOJ 题解 枚举断点\(i\) 显然的,我们要求的就是以\(i\)结尾的最长回文后缀的长度 再加上以\(i+1\)开头的最长回文前缀的长度 至于最 ...
 - Tsinsen 最长双回文串
		
求最长双回文串,正反建回文树求最大. 题目链接:http://www.tsinsen.com/ViewGProblem.page?gpid=A1280 By:大奕哥 #include<bits/ ...
 - bzoj 2565: 最长双回文串 manacher算法
		
2565: 最长双回文串 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/problem. ...
 
随机推荐
- 移动端video不全屏播放
			
<div class="m-video"> <video x5-playsinline="" playsinline="" ...
 - XE5 搭建DataSnap服务
			
1 准备工作 1.1 环境准备 XE5或XE7,操作系统Windows7(64位)操作系统. 数据库MSSQL选择SQLServer2008. 如果数据库服务没有在开发电脑上,则需要在开发电脑上安 ...
 - 【RL-TCPnet网络教程】第2章    嵌入式网络协议栈基础知识
			
第2章 嵌入式网络协议栈基础知识 本章教程为大家介绍嵌入式网络协议栈基础知识,本章先让大家有一个全面的认识,后面章节中会为大家逐一讲解用到的协议. 基础知识整理自百度百科,wiki百科等 ...
 - iBatis第五章:事务管理
			
---------------------------- 1.什么是事务 ------------------------------ 什么是事务? 需要注意的是,事务的概念不是针对某个特定的数据库的 ...
 - BitSet: 有1千万个随机数,随机数的范围在1到1亿之间。现在要求写出一种算法,将1到1亿之间没有在随机数中的数求出来?
			
package common; import java.util.ArrayList; import java.util.BitSet; import java.util.List; import j ...
 - Go语言打造以太坊智能合约测试框架(level3)
			
传送门: 柏链项目学院 第三课 智能合约自动化测试 之前课程回顾 我们之前介绍了go语言调用exec处理命令行,介绍了toml配置文件的处理,以及awk处理文本文件获得ABI信息.我们的代码算是完成了 ...
 - 调研行为树jbt
			
最近要做游戏ai,看了一下行为树的东西,因为用的java,所以主要看了jbt: https://github.com/gaia-ucm/jbt 这玩意分编辑器JBTEditor和核心库JBTCore两 ...
 - C# .NET 0配置使用Wcf(半成品)
			
设计原则:万物皆对象 背景:微软提供了一套强大的通信框架Wcf,了解请看百度百科:ttps://baike.baidu.com/item/Wcf/7374854?fr=aladdin 虽然这套通信框架 ...
 - spring 纯注解方式 与AOP
			
spring注解方式 以前我也使用过纯注解方式.现在在这里做个记录 我们先认识几个我们都耳熟能详的注解 @configuration :从spring3.0这个注解就可以用于定义配置类,可以替换xml ...
 - iview 将table的selection多选变单选方法
			
相信很多使用iview的朋友,在用到table,都会遇到需要使用selection的场景,但是总会有那么一个产品汪,觉得iview的单选效果不好,非要用selection的来做单选,那么下面这个方法就 ...