题意简述
你珂以修改字母表的顺序,能否使得一个字符串是n个字符串中字典序最小的字符串?(没有重复)对于每个字符串,你都要输出它是否能成为最小的那个。是输出YES,否则输出NO。
n<=30000,长度和<=300000
思路框架
开TRIE树,对于每个同一层的节点,连一条有向边。然后跑一遍拓扑排序,看看是否矛盾。
具体思路
比如说两个字符串abcc<abcd,那么就表示c要比d在前面。如果还有一个ad<ac,那说明d在c前面。出现了环,所以矛盾了。
我们先把n个字符串都插入到TRIE树上。每个字符串都查询一遍,对于每个点,和它同父亲的不同节点(兄弟节点),假设深度是d,那么其它字符串和这个字符串,第一个不相同的长度就是d。那么我们要求这个字符串是字典序最小的,那么我们从这个点到同一层所有其它节点都要连一条边,表示“小于”。这样才能保证我的字典序是最小的,也就是比任何人都小。
这样建完边,跑一遍拓扑排序。复杂度是O(300000+$26^2n$ )=O(300000+2e7)。能过。
代码
1 |
|