首先,对于 YS(L),字典序最小,只需要在后缀数组 sa 中找到最小的 i 满足 n−sai+1≥L。
然而又要求左端点最小。
注意到由于后缀数组是按照字典序排序的,所以如果某些后缀的前 L 个字符相等,也就是 LCP 的长度不小于 L,则它们在后缀数组中一定是连续的。
又因为 i 是最小的,所以别的这些前 L 个字符相等的后缀一定在 i 之后。
考虑到 height 数组的性质:两个后缀的 LCP 长度相当于其在后缀数组的排名间的 RMQ。
则由于 RMQ 具有单调性,可以二分来找这个区间的右端点。
找到之后,只需要对后缀数组上这一段在原串中的下标求个最小值就行了。
代码:
1 |
|