Bessie最近在玩字符串。她发现通过改变字母的顺序可以使一些字符串排在其他所有的字符串之前(按字典序从小到大排序)。
比如说,Bessie找到了对于字符串”omm”,”moo”,”mom”,和”ommnom”,她可以用标准的字母表把”mom”排在最前面,也可以用字母表”abcdefghijklonmpqrstuvwxyz”把”omm”排在最前面。但是,Bessie不能找出一个方案使”moo”或”ommnom”排在最前面。
请你帮助Bessie找出哪些字符串可以通过改变字母表来让它们排在最前面。要计算字符串X是否字典序比字符串Y小,要找到两个字符串最先出现的不同字符的位置,j。如果没有这样的位置存在,那么如果X的长度比Y短,则X字典序小于Y。否则,如果X[j]在字母表中比Y[j]早出现,那么X字典序小于Y。
输入N与N个串 , N<=30000 , Σni=1|Si| <=300000
输出
第1行,求表示能排在字典序最前面的字符串总数K。
第2..K+1行,每行包括能排在字典序最前面的字符串,输出顺序按照输入给出的顺序。
思路很直观:我们需要判断一个串是否能排第一,那么必然要确定某些字母的先后顺序,这些顺序可以用图来表示,图中如果存在矛盾则此串非法。
如何构图? 考虑用trie, 先将所有串插入trie,然后逐一判断,假设对于子串i,它在trie上走点x,那么点x的字母必须要比fa[x]的所有儿子代表的字母前,于是我们从x代表的字母向另一些字母连边。最后跑一次拓扑,若存在环则不合法。