2024.4.13 - 4.19

Sun

ABC349

A. 零和博弈概念问题。
B. 开个桶就可以。
C. 计算最高匹配位置。
D. 相当于一棵左闭右开区间线段树查询。
E. 直接搜即可。
F. 等价于高维前缀和,FWT即可。
G. Manacher优化建图(未)。

Lyndon分解

OI-Wiki

算法学习笔记

感觉还是相当抽象……

Mon

manacher材料

OI-Wiki

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 求出回文半径,然后递推以每个位置开始/结束的最长回文子串。

回文自动机初探

PAM OI-Wiki

算法学习 zhihu

回文串

【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 二分,但是我不会。

Claris 参考题解

我们的目标是:增广 \(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自动机初探

Blog
OI-Wiki

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|)\)

posted @ 2024-04-14 11:11  ydzr00000  阅读(19)  评论(0编辑  收藏  举报