亦称为广义后缀数组
Definition
LCS=Longest Common Suffix
LCP=Longest Common Preffix
Sv
S
v
表示Trie上节点v到根的路径形成的字符串
Intro
由于在Trie上,自带去重功能
显然
LCS(Su,Sv)=deplca(u,v)
L
C
S
(
S
u
,
S
v
)
=
d
e
p
l
c
a
(
u
,
v
)
我们要实现后缀数组的功能,即把
sa,rank,H(height)
s
a
,
r
a
n
k
,
H
(
h
e
i
g
h
t
)
都求出来
sa,rank
s
a
,
r
a
n
k
很好求,类比序列情形,倍增,将两个长度
2i−1
2
i
−
1
的信息双关键字排序得到
2i
2
i
长度的信息。这里,我们只需取出每个点的
2i−1
2
i
−
1
级祖先。
其余部分类似于序列上的做法。
然后我们要兹磁查询
LCP(Su,Sv)
L
C
P
(
S
u
,
S
v
)
一个思路是求出
Hi
H
i
,即
LCP(Ssai−1,Ssai)
L
C
P
(
S
s
a
i
−
1
,
S
s
a
i
)
一个方法是二分+哈希,但是有更简单的做法,我们对倍增过程每个点的
rank
r
a
n
k
保留下来(据说这叫波兰表),那么我们可以倍增求任意两个点的
LCP
L
C
P
,代码大概长这样
int LCP(int u , int v) {
if (u == v)
dep[u];
int l = 0;
per (i , lg , 0) if (rk[u][i] == rk[v][i]) {
l += 1 << i;
u = pa[u][i] , v = pa[v][i];
}
return l;
}
然后类似地,使用ST表支持RMQ即可O(1)询问任意两点LCP