Educational Codeforces Round 25
F. String Compression (2s, 512MB)
题目大意: 给定一个长度为 \(n\) 的字符串。对于串 \(S\),若满足
\[S = \underbrace{S \prime + S \prime + \cdots + S \prime}_x
\]
则可以将其压缩成 \(xS \prime\) 的形式。问将这个长度为 \(n\) 的字符串压缩后的最短长度为多少。比如 \(aabcbc\) 可以压缩成 \(2a2bc\)。
数据范围: \(n \leq 8000\)
简要题解: 令 \(f_i\) 表示压缩了字符串前 \(i\) 位所能取到的最短长度。则
\[f_i = min(f_j + g_{j + 1, i}) ~ (j < i)
\]
其中 \(g_{j + 1, i}\) 表示将串的 \(j + 1 \sim i\) 位压缩成 \(xS \prime\) 形式后的最短长度。显然要使得 \(S \prime\) 尽可能短。即问题转化为求字符串 \(S\) 的最短重复子串。考虑 KMP,那么
- 若 \((len - next_{len}) \mid len\),则 \(|S \prime| = len - next_{len}\)
- 若 \((len - next_{len}) \nmid len\),则 \(|S \prime| = len\)
故只要以每个位置为起点做一次 KMP,主动转移 DP 方程即可。
时空复杂度: \(O(n^2) - O(n)\)
关键字: KMP,DP
G. Tree Queries
题目大意: 给定一棵 \(n\) 个结点的树,初始时树上的结点均为白色。现有 \(q\) 次操作,操作有如下两种
1 x表示将 \(x\) 号结点染黑2 x询问结点 \(x\) 到所有黑点的路径上编号最小的结点
保证第一次操作必为 1 x 的形式。
数据范围: \(3 \leq n, q \leq 10^6\)
简要题解: 以第一次操作的 \(x\) 的为根,DFS 出 \(f_i\) 表示结点 \(i\) 到根的路径上的结点编号最小值,令 \(\{d_m\}\) 为当前的黑色结点序列,则此时结点 \(y\) 在第二种操作下的答案为
\[min(f_y, f_{d_1}, f_{d_2}, \cdots, f_{d_m})
\]
故只要在每加入一个黑点时维护一下最小值即可。
时空复杂度: \(O(n) - O(n)\)
关键字: DFS

浙公网安备 33010602011771号