Stammering Aliens

题目链接
题意
给一个串,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,特判即可

以上表述可能很不清楚,但是把我这个表多画一下,然后再观察,应该可以知道怎么解

AC代码

猜你喜欢

转载自blog.csdn.net/weixin_44412226/article/details/104855970