P4555 [国家集训队]最长双回文串 manacher 用manacher在处理时顺便把以某点开头/结尾的最长回文串的长度也处理掉. 然后枚举. #include<iostream> #include<cstdio> #include<cstring> #include<cctype> using namespace std; template <typename T> inline T min(T &a,T &b) {retu…
P4555 [国家集训队]最长双回文串 题目描述 顺序和逆序读起来完全一样的串叫做回文串.比如acbca是回文串,而abc不是(abc的顺序为abc,逆序为cba,不相同). 输入长度为\(n\)的串\(S\),求\(S\)的最长双回文子串\(T\),即可将\(T\)分为两部分\(X\),\(Y\),(\(|X|,|Y|≥1\))且\(X\)和\(Y\)都是回文串. 输入输出格式 输入格式: 一行由小写英文字母组成的字符串\(S\). 输出格式: 一行一个整数,表示最长双回文子串的长度. 说明…
题面:P4555 [国家集训队]最长双回文串 题解:就.就考察马拉车的理解 在原始马拉车的基础上多维护个P[i].Q[i]数组,分别表示以i结尾最长回文子串的长度和以i开头的最长回文子串的长度 然后就枚举断点,只能选择#作为断点,因为#..#才是一个字符串:第一个和最后一个#不能作为断点,因为答案要求|X|.|Y|都>=1 就维护答案 代码: #include<cstdio> #include<iostream> #include<cstring> #define…
P4555 [国家集训队]最长双回文串 题源:https://www.luogu.com.cn/problem/P4555 原理:Manacher 还真比KMP好理解 解决最长回文串问题 转化为长度为奇数的回文串 原串长度 = 新串长度半径 - 1 1. 转化:首位加不同字符,中间加 # (图片源自AcWing) 2. 求p[i]:以 \(s_i\) 为中心的最大回文串的半径(含中心) 3. 最大半径 - 1 即为所求 注意要用char数组,因为string是动态扩容的,很有可能访问到非法边界…
题目描述 顺序和逆序读起来完全一样的串叫做回文串.比如acbca是回文串,而abc不是(abc的顺序为abc,逆序为cba,不相同). 输入长度为 n 的串 S ,求 S 的最长双回文子串 T ,即可将 T 分为两部分 X , Y ,( |X|,|Y|≥1 )且 X 和 Y都是回文串. 输入输出格式 输入格式: 一行由小写英文字母组成的字符串 S . 输出格式: 一行一个整数,表示最长双回文子串的长度. 输入输出样例 输入样例#1: 复制 baacaabbacabb 输出样例#1: 复制 12…
题目链接:https://www.luogu.com.cn/problem/P4555 首先明白两个回文串,那么要使两个回文串成立,那么我们只能把$'#'$作为中间节点. 然后我们跑一边Manacher,记录$l[],r[]$,$l[i]$表示以$i$开头的最长回文串长度,$r[i]$表示以$i$结尾的最长回文串长度. 那么到最后我们只需要用线性的时间来枚举$i$,找$l_i+r_i$最大即可. 但是,在Manacher算法中有局限性:就是我们处理出来的$l,r$都是饱和回文串的,那么我们就要处…
链接: P4555 题意: 在字符串 \(S\) 中找出两个相邻非空回文串,并使它们长度之和最大. 分析: 直接使用马拉车算法求出每个点扩展的回文串.如果枚举两个回文串显然会超时,我们考虑切割一个长串,即枚举切割点,只需枚举每个 \(\#\) 即可,但为了保证两个串都非空,所以最左和最右的 \(\#\) 不能枚举.然后我们需要找到最靠左的回文串中心 \(L\) 使得该回文串包括该点,以及最靠右的回文串中心 \(R\) 使得该回文串包括该点,发现两个回文串长度之和就是 \(R-L\).同时我们发现…
题意 题目链接 Sol 我的做法比较naive..首先manacher预处理出以每个位置为中心的回文串的长度.然后枚举一个中间位置,现在要考虑的就是能覆盖到i - 1的回文串中 中心最靠左的,和能覆盖到i+1中 中心最靠右的,算一下答案取个max. 线段树维护一下区间min, max.标记永久化炒鸡好写 // luogu-judger-enable-o2 #include<bits/stdc++.h> using namespace std; const int MAXN = 1e6 + 10…
题目描述 顺序和逆序读起来完全一样的串叫做回文串.比如acbca是回文串,而abc不是(abc的顺序为abc,逆序为cba,不相同). 输入长度为 n 的串 S ,求 S 的最长双回文子串 T ,即可将 T 分为两部分 X ,Y,(|X|,|Y|≥1且 X 和 Y 都是回文串. ### xjb分析 首先给出双回文串定义: ----双回文串A是指一个可以被拆分成两个部分(B和C)的字符串 A=B+C, 且B和C都是回文串的串, A自己本身可以不是回文串. 看到回文很容易想到manacher算法 其…
题目链接 \(|S|<=10^5\),时间还是很宽松的. 允许我们使用线性/\(N\log N\)/甚至\(N \sqrt N\)的算法. 设\(l[i]\)表示以\(a[i]\)结尾的最长回文串,\(r[i]\)表示以\(a[i]\)开头的最长的回文串, 那么答案很显然就是\(\max_{i=1}^{len-1}l[i]+r[i+1]\) 怎么求? 回顾一下我们的马拉车算法 for(int i = 1; i < len; ++i){ if(i < maxright) hw[i] = m…
不知道有没有人跟我一样数据结构学傻了 首先这道题是要求回文串,那么我们可以想到manacher算法 但由于\(manacher\)不能求出双回文子串,我们要考虑一些性质 首先对于一个回文串,删掉两边的字符它一样是回文串 然后\(manacher\)求出的\(p\)数组就是他能拓展的数量,发现对于一个点对\(i, j\),当满足\(i+p_i+1≥j-p_j+1\)时,两个回文串有交集,根据上述性质,这对点对是可以构成双回文子串的 上述式子是可以用权值线段树实现的,每找到一个\(i+p_i\),丢…
BZOJ 洛谷 求给定串的最长双回文串. \(n\leq10^5\). Manacher: 记\(R_i\)表示以\(i\)位置为结尾的最长回文串长度,\(L_i\)表示以\(i\)开头的最长回文串长度.答案就是\(\max\{R_i+L_{i+1}\}\).式子可能会有差别,因为Manacher会在里面加字符.当然我们直接只用'#'位置的\(L_i+R_i\)就可以更新答案啦. Manacher,然后对于位置\(i\),设它的最远延伸距离是\(ex_i\). 然后用\(i-j\)更新\(L_j…
---题面--- 题解: 首先有一个直观的想法,如果我们可以求出对于位置i的最长后缀回文串和最长前缀回文串,那么我们枚举分界点然后合并前缀和后缀不就可以得到答案了么? 所以我们的目标就是求出这两个数列, 我们令f[i] 表示以i为结尾的最长回文后缀的长度,g[i]表示以i为开头的最长回文后缀的长度. 由于要找回文串,因此我们先想到manacher. 然后我们可以发现对于这样一个串: 原串:xxxxxxxxxx 新串:#x#x#x#x#x#x#x#x#x#x# 我们可以观察到,假设这时我们已经求出…
不算很难的一道题吧.... 很容易想到枚举断点,之后需要处理出以$i$为开头的最长回文串的长度和以$i$为结尾的最长回文串的长度 分别记为$L[i]$和$R[i]$ 由于求$R[i]$相当于把$L[i]$反过来求一遍,因此只需考虑求$L[i]$ 考虑$manacher$算法 我们注意到,当$mr$扩展时,第一个把$mr$扩展到$i$的中心$j$构成的串就是$L[i]$ 在$manacher$算法中统计一下即可 复杂度$O(n)$ #include <cstdio> #include <c…
Code: // luogu-judger-enable-o2 #include <cstdio> #include <algorithm> #include <cstring> #define maxn 300005 #define setIO(s) freopen(s".in","r",stdin) using namespace std; char str[maxn]; int n,l[maxn],ans,r[maxn];…
2565: 最长双回文串 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 1377  Solved: 714 [Submit][Status][Discuss] Description 顺序和逆序读起来完全一样的串叫做回文串.比如acbca是回文串,而abc不是(abc的顺序为"abc",逆序为"cba",不相同). 输入长度为n的串S,求S的最长双回文子串T,即可将T分为两部分X,Y,(|X|,|Y|≥1)且X和Y…
题目: Description 顺序和逆序读起来完全一样的串叫做回文串.比如acbca是回文串,而abc不是(abc的顺序为"abc",逆序为"cba",不相同).输入长度为n的串S,求S的最长双回文子串T,即可将T分为两部分X,Y,(|X|,|Y|≥1)且X和Y都是回文串. Input 一行由小写英文字母组成的字符串S. Output 一行一个整数,表示最长双回文子串的长度. 题解: 首先我们有一个结论:(在WC2017被证明) 最长的双倍回文串中一定有一个回文串…
写题遇上一棘手的题,[Apio2014]回文串,一眼看过后缀数组+Manacher.然后就码码码...过是过了,然后看一下[Status],怎么慢这么多,不服..然后就搜了一下,发现一种新东西——回文树. 回文树的功能: 假设我们有一个串S,S下标从0开始,则回文树能做到如下几点: 1.求串S前缀0~i内本质不同回文串的个数(两个串长度不同或者长度相同且至少有一个字符不同便是本质不同) 2.求串S内每一个本质不同回文串出现的次数 3.求串S内回文串的个数(其实就是1和2结合起来) 4.求以下标i…
题目描述 考虑一个只包含小写拉丁字母的字符串s.我们定义s的一个子串t的“出 现值”为t在s中的出现次数乘以t的长度.请你求出s的所有回文子串中的最 大出现值. 输入 输入只有一行,为一个只包含小写字母(a -z)的非空字符串s. 输出 输出一个整数,为逝查回文子串的最大出现值. 样例输入 [样例输入l] abacaba [样例输入2] www 样例输出 [样例输出l] 7 [样例输出2] 4 提示 一个串是回文的,当且仅当它从左到右读和从右到左读完全一样. 在第一个样例中,回文子串有7个:a,…
3676: [Apio2014]回文串 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 844  Solved: 331[Submit][Status][Discuss] Description 考虑一个只包含小写拉丁字母的字符串s.我们定义s的一个子串t的“出 现值”为t在s中的出现次数乘以t的长度.请你求出s的所有回文子串中的最 大出现值. Input 输入只有一行,为一个只包含小写字母(a -z)的非空字符串s. Output 输出一个整数,…
3676: [Apio2014]回文串 Time Limit: 20 Sec  Memory Limit: 128 MB Submit: 1680  Solved: 707 [Submit][Status][Discuss] Description 考虑一个只包含小写拉丁字母的字符串s.我们定义s的一个子串t的"出  现值"为t在s中的出现次数乘以t的长度.请你求出s的所有回文子串中的最  大出现值. Input 输入只有一行,为一个只包含小写字母(a -z)的非空字符串s. Outp…
题目描述 考虑一个只包含小写拉丁字母的字符串s.我们定义s的一个子串t的“出现值”为t在s中的出现次数乘以t的长度.请你求出s的所有回文子串中的最大出现值. 输入 输入只有一行,为一个只包含小写字母(a -z)的非空字符串s. 输出 输出一个整数,为逝查回文子串的最大出现值. 样例输入 [样例输入l] abacaba [样例输入2] www 样例输出 [样例输出l] 7 [样例输出2] 4 题解 回文自动机裸题 关于PAM个人暂时理解不是很深入,挖坑待填. 本题只需要统计fail树的子树大小,再…
回文自动机模板题 头铁了一下午hdu6599,最后发现自己的板有问题 先放这里一个正确性得到基本确认的板,过两天肝hdu6599 #pragma GCC optimize(2) #include<bits/stdc++.h> #include<iostream> #include<cstring> #include<cassert> #define MAXN 300010 #define LL long long #define BASE 2LL #defi…
BZOJ 洛谷 很久之前写(抄)过一个Hash+Manacher的做法,当时十分懵逼=-= 然而是道回文树模板题. 回文树教程可以看这里(真的挺妙的). 顺便再放上MilkyWay的笔记~ //35100kb 708ms #include <cstdio> #include <cstring> #include <algorithm> #define gc() getchar() typedef long long LL; const int N=3e5+5; stru…
https://www.luogu.org/problem/P3649 #include <bits/stdc++.h> using namespace std; typedef long long ll; struct Node { int len, ch[26], fail; int cnt; Node(int len = 0) : len(len), fail(0) { memset(ch, 0, sizeof(ch)); //下面是维护额外信息 cnt=0; } }; const in…
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=3676 这叫模版题TAT #include<cstring> #include<iostream> #include<algorithm> #include<cstdio> #define rep(i,l,r) for (int i=l;i<=r;i++) #define down(i,l,r) for (int i=l;i>=r;i--) #…
题目描述 在星历2012年,星灵英雄Zeratul预测到他所在的Aiur行星在M天后会发生持续性暴雨灾害,尤其是他们的首都.而Zeratul作为星灵族的英雄,当然是要尽自己最大的努力帮助星灵族渡过这场自然灾害.要渡过这场自然灾害,Zeratul自然要安排很多很多事情,其中一件就是将雨水疏导到大海里去.星灵族在重建家园的时候建造了N条河流,这些河流连接了共N+1个城市,当然其中包括了星灵首都.城市的编号为0…N,星灵首都的编号为0.当然水流是有方向的,除了星灵首都以外,其余的城市都有且仅有一条河流…
http://www.lydsy.com/JudgeOnline/problem.php?id=3676 另一种更简单更快常数更小的写法,很神奇……背板子. #include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<cmath> #include<map> using namespace std; ; char ch[maxn]…
经典题吧 我觉得我要换个板子,这结构体板子真TM不顺手 #include <bits/stdc++.h> using namespace std; const int N = 2e6 + 5; struct PAM_Trie { int ch[26]; int fail, len, cnt; }; struct PAM { PAM_Trie b[N]; int n, last, cnt, s[N]; PAM() { b[0].len = 0; b[1].len = -1; b[0].fail…
概念 用hash求最长回文串/回文串数 首先,易知,回文串具有单调性. 如果字符串 $s[l...r]$ 为回文串串,那么 $s[x...y]$($l < x, y < r$ 且 $|l-x| = |r-y|$)也一定是回文串. 因此,可以二分. 通常,枚举一下起点或者中点,然后二分长度. 这样复杂度为 $O(nlogn)$,逊色于马拉车 $O(n)$,但在时限不那么紧的情况下,hash也是不错的选择. 例题 题意:对于一个 0/1 串,如果将这个字符串 0 和 1 取反后,再将整个串反过来和…