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

posted @ 2017-07-24 00:43  lijingze8  阅读(120)  评论(0)    收藏  举报