从前有这样一种问题,给我们一个字符串,让我们求其所有不相同的子串中按字典序排名为K的子串
在讨论这个问题的解法之前,不妨先看如何这样一个问题:如何求一个字符串的所有不相同的子串的个数?
很容易理解,一个字符串的任意一个子串都是母串的某个后缀的某个前缀,那么求一个字符串所有不同子串的个数就相当于求其所有后缀的不同前缀的个数,至此我们想到可以对一个字符串的所有后缀按字典序排序,这样拥有相同前缀的后缀就放到了相邻的位置,再计算每个后缀对答案的贡献即可。
先拿"HOMURA"这个字符串举个例子。
我们先对其所有后缀排序,得到如下结果:
排名 | 后缀 |
1 | A |
2 | HOMURA |
3 | MURA |
4 | OMURA |
5 | RA |
6 | URA |
每个后缀的答案的贡献即为其前缀的数量,也就是其长度,那么"HOMURA"这个字符串的所有不同子串的数量即为N=1+6+4+5+2+3=21
再看下一个例子"ABABA"
排名 | 后缀 | LCP |