Lyndon Word
- 以下简称 L L L 串
- 定义:一个串是 L L L 串,当且仅当它是这个串的最小表示(最小后缀)
性质:
- 若 S , T S,T S,T 均为 L L L 串,且 S < T S<T S<T,那么 S + T S+T S+T 为 L L L 串
- L L L 串的前缀也是 L L L 串
- 将最后一个字符变大, L L L 串还是 L L L 串
- 任意串 S S S,可以划分为 S = s 1 + s 2 + ⋯ + s k S=s_1+s_2+\dots+s_k S=s1+s2+⋯+sk,满足 s i s_i si 为 L L L 串,且 s i ≥ s i + 1 s_i\ge s_{i+1} si≥si+1
求法:
后缀数组每次选一个后缀到结尾或第一个遇到的后缀,复杂度
O
(
n
log
n
)
O(n\log n)
O(nlogn)
Duval Algorithm:
设当前处理到
i
i
i,
[
1
,
i
)
[1,i)
[1,i) 已经划分好,
[
i
,
k
)
[i,k)
[i,k) 的串形如
t
+
t
+
⋯
+
t
1
t+t+\dots+t_1
t+t+⋯+t1,
t
1
t_1
t1 为
t
t
t 的前缀,可空
令
j
=
k
−
∣
t
∣
j=k-|t|
j=k−∣t∣,讨论:
S
j
=
S
k
S_j=S_k
Sj=Sk 那么循环节可以继续
S
j
<
S
k
S_j<S_k
Sj<Sk,那么
t
+
t
+
⋯
+
t
+
t
1
+
S
k
t+t+\dots +t+t_1+S_k
t+t+⋯+t+t1+Sk 是个
L
L
L 串
S
j
>
S
k
S_j>S_k
Sj>Sk,那么若干个
t
t
t 为
L
L
L 串,将
i
i
i 置于
t
1
t_1
t1 的开头
i i i 只往右移, k k k 左移的距离不超过 i i i 右移的距离,复杂度 O ( n ) O(n) O(n), c o d e code code