第一字符串(Trie&&Topology)

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代表的字母向另一些字母连边。最后跑一次拓扑,若存在环则不合法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值