Description
给定 $n\ (1 \leq n \leq 3 \times 10^4)$ 个总长不超过 $m\ (1 \leq m \leq 3 \times 10^5)$ 的互不相同的字符串,现在你可以任意指定字符之间的大小关系。问有多少个串可能成为字典序最小的串,并输出这些串。
Source
Solution
看到与字典序有关的问题,很容易想到建一棵 Trie(字典树) 。
对于每一个字符串,我们可以设它的字典序是所有字符串中最小的。
也就是说,这个字符串的第 $i$ 个字母 在 Trie 的第 $i$ 层(根节点算第 $0$ 层)的所有字母中 字典序最小。
设这个字符串的第 $i$ 个字母为 $u$,我们可以连单向边 $u \to v$,表示我们指定了 $u$ 的字典序比 $v$ 小,其中 $v$ 是第 $i$ 层的其它字母。若这个字符串是其它某个字符串的前缀,则这个字符串不可能成为字典序最小的串,比如说 $abba$ 的字典序一定比 $ab$ 大。当 $26$ 个字母间的关系形成环时,也一定不能成为字典序最小的串。
怎么判断是否形成环呢?可以用 $\rm tarjan$ 或者 拓扑排序 。
这里我采用了 拓扑排序 。我们从入度为 $0$ 的点开始,不断删去与它相连的边,并修改其它点的入度,将新的入度为 $0$ 的点加入队列。若队列已空,但还存在入度不为 $0$ 的点,则说明图存在环,反之则有解。
时间复杂度为 $O(26m)$ 。
Code
1 |
|