Description |
给定一个字符串 s s s,其中有 n a n_a na 个子串是 A 类串, n b n_b nb 个子串是 B 类串,有 m m m 个支配关系 ( x , y ) (x,y) (x,y),即第 x x x 个 A 类串可以支配第 y y y 个 B 类串。请你用 A 类串拼成一个字符串,满足第 i i i 个 A 类串所支配的 B 类串中至少有一个是第 i + 1 i+1 i+1 个 A 类串的前缀。输出所得字符串的最大长度,若无限长则输出 − 1 -1 −1。 n a , n b , m , ∣ s ∣ ≤ 2 × 1 0 5 n_a,n_b,m,|s|\le2\times10^5 na,nb,m,∣s∣≤2×105
Solution |
建拓扑图,A 指向所支配的 B,B 指向以它为前缀的 A,若出现环则答案为 − 1 -1 −1,否则答案为最长链,其中 A 的权值是它的长度,B 的权值是 0。
考虑如何建 B 指向 A 的边。建立反串的后缀自动机,将每个 A 类串和 B 类串挂到对应的节点上,寻找对应节点可以在后缀树上倍增。例如,原串是 aba
,我们要找第二个 a
对应的节点。如图,先在后缀自动机上DFS到节点 x x x,然后再倍增到 x ′ x' x′。
![](https://img-blog.csdnimg.cn/20190427163235226.png)
如下是字符串 aaba
的后缀自动机,虚线指向