2024.4.13 - 4.19
Sun
ABC349
A. 零和博弈概念问题。
B. 开个桶就可以。
C. 计算最高匹配位置。
D. 相当于一棵左闭右开区间线段树查询。
E. 直接搜即可。
F. 等价于高维前缀和,FWT即可。
G. Manacher优化建图(未)。
Lyndon分解
感觉还是相当抽象……
Mon
manacher材料
Palindrome
【POJ3974】
求字符串 \(S\) 中最长回文子串的长度。
\(1\leq |S|\leq 10^6\)。
模板题。
拉拉队排练
给定长度为 \(n\) 的字符串 \(S\),求前 \(k\) 长的奇回文子串的长度乘积,没有输出 -1
。
\(1\leq n\leq 10^6\)。
首先 manacher 求出每一个位置的回文半径,差分统计出每种长度的回文子串的数量,然后就好做了。
最长双回文串
找出字符串 \(S\) 的一个最长的子串 \(T\),满足 \(T\) 可以表示为两个回文串的前后拼接。
\(1\leq |S|\leq 10^5\)。
Manacher 求出回文半径,然后递推以每个位置开始/结束的最长回文子串。
回文自动机初探
回文串
【APIO2014】
给定字符串 \(S\),求长度乘以出现次数最大的回文子串的权值。
\(1\leq |S|\leq 3\times 10^5\)。
长度与出现次数都可以挂在 PAM 上求解。
Tue
最良表現
【ARC060F】
定义一个字符串 \(S\) 是好的仅当 \(S\) 没有完整的循环节,给定一个字符串 \(T\),将 \(T\) 划分成尽量少的好的字符串,并求方案数。
\(1\leq |T|\leq 5\times 10^5\)。
首先,若 \(T\) 是好的,则显然答案为 \((1,1)\)。
其次,若 \(T\) 的循环节长度为 \(1\),则显然答案为 \((n,1)\)。
否则,我们可以将 \(T\) 划分成 \(CCC\cdots CCC\) 的形式,且 \(|C|\ge 2\)。
我们可以将 \(T\) 的最后一个 \(C\) 的最后一个字符单独拉出成为第二段,前面的成为第一段,则显然两段都会是好的。
前后缀 KMP 即可。
筐子放球
\(n\) 个球,每个球可以放入筐子 \(a_i\) 或筐子 \(b_i\),最小化装了奇数个球的筐子数量。
\(n,m\leq 2\times 10^5\)。
首先,我们显然可以全部放入筐子 \(a_i\),然后得到一种可能的解。
接下来,将球从 \(a_i\) 移动到 \(b_i\) 可以视为边的端点取反(数量的奇偶性),故我们可以得到一张无向图,每一次可以取反一条边的两个端点,要求最小化 \(1\) 的数量。
每个连通块内,我们可以让 \(1\) 两两配对,直到最小化为止。
Raper
【PA2013】
\(n\) 天,\(k\) 个产品,每个产品都需要先进行 A 过程再进行 B 过程,可以同一天。
每个过程的部门一天只处理一个产品,且有费用,最小化费用。
\(k\leq n\leq 5\times 10^5\)。
模拟费用流,也可以 WQS 二分,但是我不会。
我们的目标是:增广 \(k\) 次,每一次,从左边的 \(a\to b\) 视为推流,从右边的 \(a\to b\) 视为退流。
发现中间的边实际上是区间 \(+1/-1\),并维护推流与退流的最短增广路。
线段树维护即可,实际上要维护的东西比较多。
字符串匹配
【NOIP2020】
给定一个字符串 \(S\),求 \(S\) 有多少种划分成 \((AB)^kC\) 的方案数。
\(1\leq |S|\leq 1.1\times 10^6\)。
首先,枚举 \(|AB|\) 然后枚举 \(k\),此时时间复杂度为 \(\mathcal{O}(n\ln n)\)。
我们预处理出每个前缀/后缀出现次数为奇数的字符种类数,然后从前往后扫描实时更新。
接下来,我们要处理出前缀中出现了恰好 \(k\) 个不同的出现奇数次的字符的前缀数量,这个暴力,复杂度为 \(\mathcal{O}(n\Sigma)\)。
问题转化为:判断长度为 \(i\) 的前缀是否是长度为 \(j\) 的前缀的完整循环节,这个用 KMP 好做。
绿绿和串串
【THUPC2018】
给定一个字符串 \(S\),问有多少种不同的 \(|R|\) 使得 \(R\) 满足如下条件:
- \(T\) 初始等于 \(R\),每一次操作将 \(T\) 除去最后一个字符倒置接在当前 \(T\) 的后面视作新的 \(T\),最终的 \(T\) 满足 \(S\) 是 \(T\) 的前缀。
你需要找出所有可能的不大于 \(|S|\) 的 \(|R|\)。
\(1\leq |S|\leq 10^6\)。
考虑 manacher,我们知道每一个字符有回文半径。
如果一个字符向右到达字符串末尾,那么该位置可行;如果一个字符向左到达字符串开头,那么其是否可行从其向右到达的位置继承。
双倍回文
【SHOI2011】
给定字符串 \(S\),求 \(S\) 中最长的满足如下条件的子串的长度。
- \(S\) 的长度是偶数且回文。
- \(S\) 的左半部分和右半部份长度是偶数且回文。
\(1\leq |S|\leq 5\times 10^5\)。
本质不同的回文串的数量是 \(\mathcal{O}(n)\) 级别,对每一个不同的回文串判断是否合法即可。
通过在 PAM 上确定长度不超过该节点对应回文串长度一半的节点,然后对长度的合法性进行判定也可以通过。
快乐的JYY
【JSOI2013】
给定字符串 \(A,B\),求 \(A\) 与 \(B\) 的公共回文子串对数,位置不同的算多种。
\(1\leq |A|,|B|\leq 5\times 10^4\)。
给 \(A,B\) 同时建立 PAM,只考虑上面相同的转移,假设当时处于同一状态 \((x,y)\)(排除根节点),那么其对答案的贡献是 \(cnt_x\times cnt_y\),其中 \(cnt\) 表示该节点的数量。
秩序魔咒
求 \(A,B\) 最长公共回文子串的长度以及本质不同的种类数。
\(1\leq |A|,|B|\leq 260817\)。
给 \(A,B\) 同时建立 PAM,只考虑上面相同的转移,假设当时处于同一状态 \((x,y)\)(排除根节点),那么尝试用长度与更新,如果长度相等则种类数加一。
Wed
Virus synthesis
【CERC2014】
给定一个仅由 AGCT
构成的字符串 \(S\),每次进行一个操作,请问最少多少次操作从空串改为指定串 \(S\)。
- 向当前串最前面或最后面追加给定字符。
- 翻转当前的串得到 \(T\),向当前串最前面或最后面追加 \(T\)。
\(1\leq |S|\leq 10^5\)。
首先,对于所有偶回文串,我们都可以考虑搞定一半然后翻转。
考虑 DP,记 \(f_i\) 表示从空串得到节点 \(i\) 对应的字符串需要的最少步数。
由于最终肯定有一次翻转,直接初始化 \(f_0 = 1\)。
初始时,\(f_i = len_i\),然后从偶回文串根开始 bfs 转移 DP,每找到一条边 \((u,v)\) 就 \(f_v \gets \min(f_v, f_u + 1)\)。
然后对于每一个节点,我们尝试直接搞定它的一半然后翻转一次,\(f_u \gets \min(f_u, f_{h_u} + 1 + (l_u - l_{h_u}))\),就是暴力填充到一半然后翻转一次。
则 \(\min\{f_i + n - len_i\}\) 即为答案。
Thur
AC自动机初探
Censoring G
给定一个文本串 \(S\) 与 \(n\) 个模式串 \(T_i\),每次删除出现在最左边的模式串然后拼接前后部分,请问最终得到的文本是什么?
\(1\leq n\leq 2000, 1\leq |S|, \sum |T_i|\leq 2\times 10^5\),保证 \(T_i\) 不是 \(T_j\) 的子串。
类比单模匹配,本题我们依旧选择开栈并记录每个元素在 AC 自动机的匹配位置。
如果匹配到 AC 自动机上一个被标记为结束点的位置就弹出栈顶的对应元素。
Palindrome Construction
【ABC349G】
给定一个长度为 \(n\) 的正整数序列中各元素的回文半径,求出字典序最小的满足条件的正整数序列。
\(n\leq 2\times 10^5\)。
考虑 Manacher 优化等量关系,此时有效的关系只有 \(\mathcal{O}(n)\) 个,使用并查集合并,为了“字典序最小”的处理,我们将所有节点往最小的节点编号合并。
不等量关系我们从大的连向小的表示不能相等,此时是 DAG,暴力求 mex 即可。
Fri
PAL-Palindromes
【POI2006】
给定 \(n\) 个互不相同的回文串 \(S_i\),求有多少组有序二元数对 \((i,j)\) 满足 \(1\leq i,j\leq n\) 且 \(S_i + S_j\) 是回文串。
\(1\leq n, \sum |S_i|\leq 2\times 10^6\)。
SB 一点的做法,考虑 Hash。
根据定义,\(S_i\) 正串与反串的 Hash 值一致,记为 \(H_i\),若 \(S_i + S_j\) 回文,则显然有 \(H_i\times B^{|S_j|} + H_j = H_j\times B^{|S_i|} + H_i\)。
移项得到 \(\dfrac{H_i}{B^{|S_i|} - 1} = \dfrac{H_j}{B^{|S_j|} - 1}\),那么根据 \(\dfrac{H_i}{B^{|S_i|} - 1}\) 分类一下即可。
直接拿 map
存储即可,时间复杂度为 \(\mathcal{O}(n\log_2 n + \sum |S_i|)\)。
Video Game
【USACO2012Jan Gold】
给定 \(n\) 个模式串 \(S_i\),求一个长度为 \(k\) 的文本串 \(T\) 使得 \(T\) 中出现的 \(S_i\) 的数量总和尽量多。
\(n\leq 20, k\leq 1000, |S_i|\leq 15, |\Sigma|=3\)。
首先将所有模式串插入 AC 自动机,然后考虑 DP。
记 \(f_{i,j}\) 表示串长为 \(i\),最后到达了 AC 自动机上的节点 \(j\),当前的匹配数量总和的最大值,记 \(g_{i,j}\) 表示串长为 \(i\),最后能否到达 AC 自动机上的节点 \(j\)。
于是若 \(g_{i,j} = 1\),将 \(f_{i,j}\) 向后刷表转移,记 \(to\) 表示 \(j\) 的后继状态,那么尝试用 \(f_{i,j} + h_{to}\) 更新答案。
其中 \(h_{to}\) 表示 \(to\) 节点的匹配数量,其值为 fail 树上根节点到当前节点上每个节点的结束字符串数量总和。
时间复杂度为 \(\mathcal{O}(m|\Sigma| \sum|s_i|)\)。
文本生成器
【JSOI2007】
请问有多少个长度为 \(m\) ,字符集 \(\Sigma\) 为英文大写字母的文本串包含至少一个给定的 \(n\) 个模式串 \(S_i\) 为子串?
\(n\leq 60, m\leq 100, |s_i|\leq 100\)。
包含至少一个等于总串数量 \(26^m\) 减去不包含的情况总和,后者考虑 DP。
首先将文本串插入 AC 自动机,记 \(f_{i,j}\) 表示长度为 \(i\) 并且最终到达了 AC 自动机上节点 \(j\) 的合法方案数。
考虑一个 \(i\) 的后继状态 \(to\),如果 \(to\) 合法,那么 \(f_{i+1,to}\gets f_{i+1,to} + f_{i,j}\),而 \(to\) 合法满足它不包含给定的模式串。
判定方法与上一题类似,即为 fail 树上从根节点到当前节点没有一个节点作为字符串的结尾。
时间复杂度为 \(\mathcal{O}(m|\Sigma| \sum|s_i|)\)。