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…
题面:P4555 [国家集训队]最长双回文串 题解:就.就考察马拉车的理解 在原始马拉车的基础上多维护个P[i].Q[i]数组,分别表示以i结尾最长回文子串的长度和以i开头的最长回文子串的长度 然后就枚举断点,只能选择#作为断点,因为#..#才是一个字符串:第一个和最后一个#不能作为断点,因为答案要求|X|.|Y|都>=1 就维护答案 代码: #include<cstdio> #include<iostream> #include<cstring> #define…
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 [国家集训队]最长双回文串 题源: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 都是回文串. ### xjb分析 首先给出双回文串定义: ----双回文串A是指一个可以被拆分成两个部分(B和C)的字符串 A=B+C, 且B和C都是回文串的串, A自己本身可以不是回文串. 看到回文很容易想到manacher算法 其…
---题面--- 题解: 首先有一个直观的想法,如果我们可以求出对于位置i的最长后缀回文串和最长前缀回文串,那么我们枚举分界点然后合并前缀和后缀不就可以得到答案了么? 所以我们的目标就是求出这两个数列, 我们令f[i] 表示以i为结尾的最长回文后缀的长度,g[i]表示以i为开头的最长回文后缀的长度. 由于要找回文串,因此我们先想到manacher. 然后我们可以发现对于这样一个串: 原串:xxxxxxxxxx 新串:#x#x#x#x#x#x#x#x#x#x# 我们可以观察到,假设这时我们已经求出…
题目描述 顺序和逆序读起来完全一样的串叫做回文串.比如acbca是回文串,而abc不是(abc的顺序为abc,逆序为cba,不相同). 输入长度为 n 的串 S ,求 S 的最长双回文子串 T ,即可将 T 分为两部分 X , Y ,( |X|,|Y|≥1 )且 X 和 Y都是回文串. 输入输出格式 输入格式: 一行由小写英文字母组成的字符串 S . 输出格式: 一行一个整数,表示最长双回文子串的长度. 输入输出样例 输入样例#1: 复制 baacaabbacabb 输出样例#1: 复制 12…
不算很难的一道题吧.... 很容易想到枚举断点,之后需要处理出以$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…
题目链接 \(|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…