题目链接
题意
给一个串,NUM[子串]表示该子串出现的次数,问使NUM[子串] >= m的子串长度最长是多少,如果最长的有多个,找到更靠后的子串。
思路
以串S=abracadabra为例
后缀第几小 | lcp | 0 | 1 | 2 | 3 | 4 | 5 |
---|---|---|---|---|---|---|---|
0 | 0 | ||||||
1 | 1 | a | |||||
2 | 4 | a | b | r | a | ||
3 | 1 | a | |||||
4 | 1 | a | |||||
5 | 0 | ||||||
6 | 3 | b | r | a |
观察上述表格(先不看其他后缀),思考一个问题,NUM[子串(长度等于2、1)]的所有取值?
观察2这一列
只有后缀第2小或者后缀第6小有值,这说明NUM[子串(长度等于2)] = 2
观察1这一列
只有后缀第1,2,3,4小或者后缀第6小有值,这说明NUM[子串(长度等于1)] = 5或2
那么,对于任意NUM[子串(长度等于i)]的所有取值我们均可以求出。
有一个坑处,lcp = 0这种情况,对应的是m = 1。所以如果m = 1,特判即可
以上表述可能很不清楚,但是把我这个表多画一下,然后再观察,应该可以知道怎么解