SPOJ SUBLEX Lexicographical Substring Search

题意

把一个字符串所有的不同的字串全拿出来,按字典序排序,第k小的字符串是什么样子的呢?

思路

字串问题当然是后缀自动机了。对于给出的字符串,建立一个后缀自动机,然后对后缀自动机对应的状态图进行一次拓扑排序,每个节点的深度就是节点上携带的mxn(当前状态对应的字串最长为多少位)。接下来我们从深度最大的节点开始往根部处理每一个节点,我们要求出的就是对于每个能走的边,所有接下来的以这条边对应的字母开头的字串数目,而节点上面存的是节点出边的边权之和。这样我们就得到了一个处理好的图,我们只要在这个图上面搜索,逼近k值就可以了。

因为SPOJ卡常数特别严重,所以拓扑排序要使用计数排序的方法,而且要开额外的数组纪录每一个节点所有的孩子来加快之后的搜索速度。

代码

 

Leave a Reply

Scroll to top