$SAM$ 优化连边 + $DAG$ 上 $dp$ .
- 首先可以搞一个 $n_a+n_b$ 个节点的图.如果一个 $A$ 串支配了一个 $B$ 串,就从这个 $A$ 串对应的点向 $B$ 串对应的点连一条有向边.如果一个 $B$ 串是一个 $A$ 串的前缀,就从这个 $B$ 串对应的点向 $A$ 串对应的点连一条有向边.
- 然后判环,如果没有环就在 $DAG$ 上 $dp$ 找最长路径.节点数目为 $O(n_a+n_b)$ ,可以接受.
- 但是暴力连边的时间复杂度高达 $O(n_an_b)$ ,于是获得 $40$ 分好成绩.
- 考虑利用 $SAM$ 的 $parent$ 树自带的树形结构来优化连边.
- 第一类边,对于一个 $A$ 串,我们可以在 $SAM$ 上倍增找到它对应的节点,然后对于每个它支配的 $B$ 串也用倍增找到节点,从 $A$ 串节点向 $B$ 串节点连一条有向边.
- 第二类边,要求 $B$ 串是 $A$ 串前缀.我们如果把主串反过来,就变成了 $B$ 串是 $A$ 串的后缀.在 $parent$ 树上显然表现为 $B$ 对应的节点是 $A$ 对应的节点的祖先.那么建 $parent$ 树时就从父亲到儿子连有向边,边自动就连好了.
- 这样连边的时间复杂度为 $O(|S|log|S|)$ ,节点数目为 $O(|S|)$ ,均可以接受.
- 但还存在一个问题. $parent$ 树上一个节点对应的子串不止一个.可能出现两个 $A$ 串都被定位到一个节点上.于是每次 $A$ 串定位到一个位置时就新建一个节点栽上去.新建 $n_a$ 个节点,不会爆炸.
1 |
|