“证明直接使用LCP数组的区间最小值等式。若活动秩 $s<u<r$,则”
形式陈述
给定长度为
第一项只是没有前驱时的哨兵;空文本对应空数组。
设两个不同起点
因此先在半开数组区间
直觉
字典序中,拥有同一前缀的字符串形成连续区间。若首尾两条后缀都以长度
例子与边界
banana 的相邻值
后缀数组为
于是 ana 与 anana 相邻,共同前缀长 a 与 anana 的秩为 banana$ 会多出最小后缀 $,数组和下标也要相应改变。
Kasai 构造:长度每步至多下降一
按文本起点顺序,定义
即从一个起点移到下一个,已有公共前缀长度至多下降一,也可能增加很多;不是每步至少下降一。
若
据此可从已知的下界继续比较,而不从零开始。假定
def lcp_array(text, sa):
n = len(text)
isa = [0] * n
for rank, start in enumerate(sa):
isa[start] = rank
lcp = [0] * n
h = 0
for p in range(n):
rank = isa[p]
if rank == 0:
h = 0
continue
q = sa[rank - 1]
while p + h < n and q + h < n and text[p + h] == text[q + h]:
h += 1
lcp[rank] = h
h = max(h - 1, 0)
return lcp
每个正常迭代结束时
推论与应用
最大
这里不能把
后缀树把两条后缀的公共前缀表示为叶子 LCA 的字符串深度;LCP 加 RMQ 则用数组给出同一查询结果。FM-index的基本反向搜索使用 BWT 与 rank,LCP 可辅助其他导航,却不是该计数接口自动附带的组成部分。
参考资料
- Toru Kasai, Gunho Lee, Hiroki Arimura, Setsuo Arikawa and Kunsoo Park, “Linear-Time Longest-Common-Prefix Computation in Suffix Arrays and Its Applications,” CPM 2001, LNCS 2089, pp. 181–192.
- Giovanni Manzini, Two Space Saving Tricks for Linear Time LCP Array Computation, SWAT 2004, LNCS 3111, pp. 372–383,§2.2 与 Figure 3:Kasai 的下降不等式和完整构造;后文讨论更省工作空间的变体。