学习了 2022 年集训队论文 《浅谈与 Lyndon 理论有关的字符串组合问题》 写得很好,像我这样的字符串小白也能看懂
Lyndon 分解
- 若字符串
w
w
w 小于它的每一个真后缀,则称
w
w
w 是 Lyndon 串。
- 若字符串
w
w
w 是 Lyndon 串,则
w
k
w
′
w^kw'
wkw′ 是近似 Lyndon 串,其中
w
′
w'
w′ 是
w
w
w 的前缀。
串
w
w
w 可以分解位
w
1
c
1
…
w
k
c
k
w_1^{c_1}\dots w_{k}^{c_k}
w1c1??…wkck??,其中
w
1
>
?
>
w
k
w_1>\dots>w_k
w1?>?>wk?。
最小后缀族:对于串
w
w
w 的后缀
w
′
w'
w′,若存在
u
u
u 使得任意后缀
w
′
′
w''
w′′ 满足
w
′
u
<
w
′
′
u
w'u<w''u
w′u<w′′u,则
w
′
w'
w′ 是
w
w
w 的一个有效后缀,有效后缀的集合称为
w
w
w 的最小后缀族,记为
S
S
(
w
)
SS(w)
SS(w)
- 若
u
2
v
,
u
v
,
v
u^2v,uv,v
u2v,uv,v 都是
w
w
w 的后缀,则
u
v
uv
uv 不是有效后缀。
- 若
u
,
v
∈
S
S
(
w
)
,
∣
u
∣
<
∣
v
∣
u,v\in SS(w),|u|<|v|
u,v∈SS(w),∣u∣<∣v∣,则
u
u
u 是
v
v
v 的
b
o
r
d
e
r
border
border,且
2
∣
u
∣
≤
∣
v
∣
2|u|\le |v|
2∣u∣≤∣v∣。
- 有效后缀形如
s
i
=
w
i
c
i
…
w
k
c
k
s_i=w_i^{c_i}\dots w_k^{c_k}
si?=wici??…wkck??
-
s
i
+
1
s_{i+1}
si+1? 是
s
i
s_i
si? 的前缀的充要条件是
i
≤
λ
i\le \lambda
i≤λ,其中
s
λ
s_{\lambda}
sλ? 是对
w
w
w 进行 Duval 算法时第一次比较完字符串末尾时的近似 Lyndon 后缀。(因为
w
i
x
s
i
+
1
w_i^xs_{i+1}
wix?si+1? 是近似 Lyndon 后缀,所以
s
i
+
1
s_{i+1}
si+1? 是
w
i
w_{i}
wi? 的前缀)
后接
v
v
v 的最小后缀:
- 给定
w
,
v
w,v
w,v,求
w
w
w 的后缀
u
u
u,使得
u
v
uv
uv 最小,记为
M
i
n
s
u
f
(
w
,
v
)
Minsuf(w, v)
Minsuf(w,v)
由于
u
u
u 是
s
λ
,
…
,
s
k
s_{\lambda},\dots,s_k
sλ?,…,sk? 之一,另
w
i
=
s
i
+
1
+
y
i
w_i=s_{i+1}+y_i
wi?=si+1?+yi?,
x
i
=
y
i
+
s
i
+
1
x_i=y_i+s_{i+1}
xi?=yi?+si+1?,则有
s
i
=
s
i
+
1
+
x
i
c
i
s_i=s_{i+1}+x_i^{c_i}
si?=si+1?+xici??。
-
?
i
∈
[
λ
,
k
?
1
]
,
y
i
>
x
i
+
1
∞
\forall i\in [\lambda,k-1],y_i>x_{i+1}^{\infty}
?i∈[λ,k?1],yi?>xi+1∞?,即证
s
i
+
1
y
i
>
s
i
+
1
x
i
+
1
∞
s_{i+1}y_i>s_{i+1}x_{i+1}^{\infty}
si+1?yi?>si+1?xi+1∞?,即
w
i
>
w
i
+
1
∞
s
i
+
2
w_i>w_{i+1}^{\infty}s_{i+2}
wi?>wi+1∞?si+2?,又有
w
i
>
w
i
+
1
∞
w_i>w_{i+1}^{\infty}
wi?>wi+1∞?。
-
?
i
∈
[
λ
,
k
?
1
]
,
x
i
∞
>
x
i
+
1
∞
\forall i\in [\lambda,k-1],x_i^{\infty}>x_{i+1}^{\infty}
?i∈[λ,k?1],xi∞?>xi+1∞?
考虑比较
s
i
v
s_iv
si?v 和
s
i
+
1
v
s_{i+1}v
si+1?v 的大小,发现这等价与比较
x
i
c
i
v
x_i^{c_i}v
xici??v 和
v
v
v 的大小,这等价于比较
x
i
∞
x_i^{\infty}
xi∞? 和
v
v
v 的大小,故可以二分找到一个
i
i
i 使得
x
i
∞
>
v
>
x
i
+
1
∞
x_i^{\infty}>v>x_{i+1}^{\infty}
xi∞?>v>xi+1∞?,此时
M
i
n
s
u
f
(
w
,
v
)
=
s
i
+
1
v
Minsuf(w,v)=s_{i+1}v
Minsuf(w,v)=si+1?v。
例:JSOI 2019 节日庆典,求每个前缀的最小表示。 线性做法:考虑当前串可以表示成
u
w
k
w
′
uw^kw'
uwkw′,那么只需要考虑最小表示开头为
w
k
w
′
w^kw'
wkw′ 或开头在
w
′
w'
w′ 里面的情况,在
w
′
w'
w′ 里面时发现去掉最后
∣
w
∣
|w|
∣w∣ 个字符即为
u
w
k
?
1
w
′
uw^{k-1}w'
uwk?1w′ 的循环表示,是之前已经求出的答案。
Runs
Runs 的定义和 Runs 定理
定义:本源串,
k
k
k 次方串,平方串,本源
k
k
k 次方串。 Runs:对于字符串
S
S
S,若其一个子串
S
[
i
,
j
]
S[i,j]
S[i,j] 具有最小周期
p
p
p,满足
2
p
≤
j
?
i
+
1
2p\le j-i+1
2p≤j?i+1,且
S
i
?
1
≠
S
i
+
p
?
1
,
S
j
+
1
≠
S
j
+
1
?
p
S_{i-1}\neq S_{i+p-1},S_{j+1}\neq S_{j+1-p}
Si?1??=Si+p?1?,Sj+1??=Sj+1?p?,则
r
=
(
i
,
j
,
p
)
r=(i,j,p)
r=(i,j,p) 构成
S
S
S 的一个 run,
e
r
=
j
?
i
+
1
p
e_r=\frac{j-i+1}{p}
er?=pj?i+1? 为它的指数,
S
S
S 的所有 runs 的集合记为
R
u
n
s
(
S
)
Runs(S)
Runs(S)。 Runs 为研究幂串结构提供了方法,容易发现我们定义的 runs 满足 run 里面至少有一个平方串。
- 周期相同的两个 runs 的交长度
<
p
<p
<p。
- 任何一个 run
r
=
(
i
,
j
,
p
)
r=(i,j,p)
r=(i,j,p) 可以导出
j
?
i
+
1
?
2
p
j-i+1-2p
j?i+1?2p 个本源平方串,每个本源平方串由唯一一个 run 导出
下面,我们将证明两个重要的命题: Runs 定理:记
ρ
(
n
)
\rho(n)
ρ(n) 和
σ
(
n
)
\sigma(n)
σ(n) 表示长为
n
n
n 的串的 runs 个数以及 runs 指数和的最大值,有
ρ
(
n
)
<
n
,
σ
(
n
)
<
3
n
\rho(n)<n,\sigma(n)<3n
ρ(n)<n,σ(n)<3n。
记
<
0
,
<
1
<_0,<_1
<0?,<1? 为字符集上两种相反的序。
- 定义 Lyndon 根:对于一个 run
r
=
(
i
,
j
,
p
)
r=(i,j,p)
r=(i,j,p),若在字典序
<
<
< 下其长为
p
p
p 的子串
S
[
u
,
u
+
p
?
1
]
S[u,u+p-1]
S[u,u+p?1] 为 Lyndon 串,则称
S
[
u
,
u
+
p
?
1
]
S[u,u+p-1]
S[u,u+p?1] 是
r
r
r 关于
<
<
< 的一个 Lyndon 根。
- 定义 Lyndon 数组:定义
l
t
(
i
)
l_t(i)
lt?(i) 表示在
<
t
<_t
<t? 下左端点为
i
i
i 的最长 Lyndon 串的右端点,将
l
t
(
i
)
l_t(i)
lt?(i) 成为
S
S
S 的 Lyndon 数组。
- 性质:
l
0
(
i
)
,
l
1
(
i
)
l_0(i),l_1(i)
l0?(i),l1?(i) 恰有一个为
i
i
i,证明略。
- 性质:对于 run
r
=
(
i
,
j
,
p
)
r=(i,j,p)
r=(i,j,p),设
S
j
+
1
<
t
S
j
+
1
?
p
S_{j+1}<_tS_{j+1-p}
Sj+1?<t?Sj+1?p?,那么其任意 Lyndon 根
S
[
u
,
u
+
p
?
1
]
S[u,u+p-1]
S[u,u+p?1] 有
l
t
(
u
)
=
u
+
p
?
1
l_t(u)=u+p-1
lt?(u)=u+p?1。证明:对于
S
[
u
,
v
]
,
u
+
p
?
1
<
v
≤
j
S[u,v],u+p-1<v\le j
S[u,v],u+p?1<v≤j 满足其为
w
k
w
′
w^kw'
wkw′,对于
v
>
j
v>j
v>j 显然不是 Lyndon 串。
- 定义 Lyndon 根:若 run
r
=
(
i
,
j
,
p
)
r=(i,j,p)
r=(i,j,p) 的 Lyndon 根
S
[
u
,
u
+
p
?
1
]
S[u,u+p-1]
S[u,u+p?1] 满足
u
>
i
u>i
u>i,那么其为真 Lyndon 根。
- 性质:
S
[
u
,
l
0
(
u
)
]
,
S
[
u
,
l
1
(
u
)
]
S[u,l_0(u)],S[u,l_1(u)]
S[u,l0?(u)],S[u,l1?(u)] 不可能同时为两个 run 的 Lyndon 根。证明:设
l
0
(
u
)
=
u
l_0(u)=u
l0?(u)=u,则有
S
u
=
S
u
?
1
+
S
u
+
p
?
1
=
S
l
1
(
u
)
S_u=S_{u-1}+S_{u+p-1}=S_{l_1(u)}
Su?=Su?1?+Su+p?1?=Sl1?(u)?,故
S
[
u
,
l
1
(
u
)
]
S[u,l_1(u)]
S[u,l1?(u)] 不是 Lyndon 串。
- 性质:任意两个不同的 run 的真 Lyndon 根左端点集合不交。(由上一条得到)
设
B
(
r
)
B(r)
B(r) 表示 run
r
r
r 所有真 Lyndon 根的左端点集合,有任意
B
(
r
1
)
∩
B
(
r
2
)
=
?
B(r_1)\cap B(r_2)=\empty
B(r1?)∩B(r2?)=?,所以
∑
r
∣
B
(
r
)
∣
≤
n
?
1
\sum_r |B(r)|\le n-1
∑r?∣B(r)∣≤n?1,又
B
(
r
)
≥
1
B(r)\ge 1
B(r)≥1,故
∣
R
u
n
s
(
S
)
∣
≤
n
?
1
|Runs(S)|\le n-1
∣Runs(S)∣≤n?1。 若
r
=
(
i
,
j
,
p
)
r=(i,j,p)
r=(i,j,p) 循环了
x
x
x 次,则真 Lyndon 根至少有
x
?
1
x-1
x?1 个,故
∣
B
(
r
)
∣
>
e
r
?
2
|B(r)|>e_r-2
∣B(r)∣>er??2,
∑
r
(
e
r
?
2
)
≤
n
?
1
\sum_r(e_r-2)\le n-1
∑r?(er??2)≤n?1,故
∑
r
e
r
<
3
n
\sum_r e_r<3n
∑r?er?<3n。
Runs 的求解方法
算法 1:枚举周期
p
p
p,用 NOI2016 优秀的拆分的做法解决。 算法 2:由于 runs 的 Lyndon 根一定形如
S
[
i
,
l
t
(
i
)
]
S[i,l_t(i)]
S[i,lt?(i)],所以先求出 Lyndon 数组再进行扩展即可。求 Lyndon 数组可以考虑一种从后向前构造 Lyndon 分解的方法,即从后往前扫,维护一个单调栈,每次加入一个字符,检查能不能和栈顶的串合并。
幂串的结构
- 性质:若
u
2
,
v
2
,
w
2
u^2,v^2,w^2
u2,v2,w2 是本源平方串,且
u
2
u^2
u2 是
v
2
v^2
v2 的前缀,
v
2
v^2
v2 是
w
2
w^2
w2 的前缀,则
∣
w
∣
≥
∣
u
∣
+
∣
v
∣
|w|\ge |u|+|v|
∣w∣≥∣u∣+∣v∣。
于是我们有结论:串
w
w
w 的本源平方前缀个数为
O
(
log
?
∣
w
∣
)
O(\log |w|)
O(log∣w∣) 个。 串
w
w
w 的本源平方串个数为
O
(
∣
w
∣
log
?
∣
w
∣
)
O(|w|\log |w|)
O(∣w∣log∣w∣) 个,于是也有
∑
r
(
j
?
i
+
1
?
2
p
)
\sum_r (j-i+1-2p)
∑r?(j?i+1?2p) 为
O
(
∣
w
∣
log
?
∣
w
∣
)
O(|w|\log |w|)
O(∣w∣log∣w∣)。
- 性质:字符串
w
w
w 的本质不同本源平方串个数为
O
(
∣
w
∣
)
O(|w|)
O(∣w∣)。证明:考虑最后一次出现位置,假设一个左端点有 3 个
u
,
v
,
w
u,v,w
u,v,w,则有
2
∣
u
∣
≤
∣
w
∣
2|u|\le |w|
2∣u∣≤∣w∣,那么
u
2
u^2
u2 不是最后一次出现。
例:ZJOI 2020 字符串,区间询问本质不同平方串。
- 先忽略本质不同,考虑 run
r
=
(
i
,
j
,
p
)
r=(i,j,p)
r=(i,j,p),其每个
S
[
l
,
l
+
2
k
p
?
1
]
S[l,l+2kp-1]
S[l,l+2kp?1] 都可以作为一个贡献。将
(
l
,
l
+
2
k
p
?
1
)
(l,l+2kp-1)
(l,l+2kp?1) 看作一个点,那么对于一个
k
k
k,我们可以将操作看成斜线加,加的次数是
∑
r
j
?
i
+
1
p
\sum_r \frac{j-i+1}{p}
∑r?pj?i+1?,其为
O
(
n
)
O(n)
O(n) 。
下面考虑本质不同,对于两个相同子串
S
[
i
,
i
+
2
p
?
1
]
,
S
[
j
,
j
+
2
p
?
1
]
S[i,i+2p-1],S[j,j+2p-1]
S[i,i+2p?1],S[j,j+2p?1],我们在
(
i
,
j
+
2
p
?
1
)
(i,j+2p-1)
(i,j+2p?1) 放一个权值为
?
1
-1
?1 的点即可。在一个 run 里面的同样只需要枚举
k
k
k 然后斜线减,否则就是和前面一个 run 里面的相同。从做到右扫 runs,我们只关注 run 里面第一次出现的平方串,容易发现其个数为
∑
r
(
j
?
i
+
1
?
2
p
)
~
O
(
n
log
?
n
)
\sum_r (j-i+1-2p)\sim O(n\log n)
∑r?(j?i+1?2p)~O(nlogn),故直接使用 hash,然后在平面上会添加
O
(
n
log
?
n
)
O(n\log n)
O(nlogn) 个点。时间复杂度
O
(
n
log
?
2
n
+
q
log
?
n
)
O(n\log^2 n+q\log n)
O(nlog2n+qlogn)。
Lyndon 树
对于一个 Lyndon 串
w
w
w,我们可以得到一个
2
∣
w
∣
?
1
2|w|-1
2∣w∣?1 个结点的二叉树,每个结点代表一个子串(且也为 Lyndon 串),构建的方法为找到
w
=
u
+
v
w=u+v
w=u+v,其中
v
v
v 是
w
w
w 的最小后缀,然后
u
,
v
u,v
u,v 为
w
w
w 的两个儿子。
构建方法:从后向前,维护
[
i
+
1
,
n
]
[i+1,n]
[i+1,n] 组成的森林(每一个子树是一个 Lyndon 串),加入当前字符
S
i
S_i
Si?,会合并栈顶的一些 Lyndon 串,将这些点串起来即可。
-
性质:以
i
i
i 为左端点的最长 Lyndon 子串对应 Lyndon 树中以
i
i
i 为左端点的最大子树。(证明:建树的过程和求 Lyndon 数组相同) -
性质:若
S
[
l
,
r
]
S[l,r]
S[l,r] 是 Lyndon 串,则
l
,
…
,
r
l,\dots,r
l,…,r 的 LCA 的子树的左端点为
l
l
l。
区间短周期查询:每次查询
S
[
l
,
r
]
S[l,r]
S[l,r] 的最小周期,若最小周期大于一半则不用输出。
- 这等价与查询是否有一个包含
[
l
,
r
]
[l,r]
[l,r] 且周期不超过
r
?
l
+
1
2
\frac{r-l+1}{2}
2r?l+1? 的 run。
以
<
0
,
<
1
<_0,<_1
<0?,<1? 两种比较关系建 Lyndon 树,分别求出
l
,
…
,
?
l
+
r
2
?
l,\dots,\lceil \frac{l+r}{2}\rceil
l,…,?2l+r?? 的 LCA,检查以其右子树为 Lyndon 根的 runs。 证明:我们只需要找到一个包含
m
m
m 的 Lyndon 根。 LCA 的右子树
x
x
x 满足条件,若其不为答案的 runs
r
=
(
i
,
j
,
p
)
r=(i,j,p)
r=(i,j,p),那么我们知道
x
x
x 的右端点大于
j
j
j,但是
S
j
+
1
<
S
j
+
1
?
p
S_{j+1}<S_{j+1-p}
Sj+1?<Sj+1?p?,这与
x
x
x 的子树是 Lyndon 串矛盾。
Lyndon 串计数
- 记
w
^
\hat w
w^ 为
w
w
w 的最小表示,若
w
^
=
w
\hat w=w
w^=w 则称
w
w
w 为 necklace。
- 性质:每个 Lyndon 串都是 necklace,每个 necklace 可以写成
w
k
w^k
wk 其中
w
w
w 是 Lyndon 串。
w
^
\hat w
w^ 的求法:首先找到
u
k
=
w
u^k=w
uk=w 然后求
u
^
\hat u
u^,只需要对
u
u
uu
uu 求 Lyndon 分解,然后找到最后一个在
[
1
,
∣
u
∣
]
[1,|u|]
[1,∣u∣] 中分解的地方
x
x
x,那么
u
^
=
u
[
x
,
∣
u
∣
]
+
u
[
1
,
x
?
1
]
\hat u=u[x,|u|]+u[1,x-1]
u^=u[x,∣u∣]+u[1,x?1]。
求前驱 necklace:求长度等于
∣
w
∣
|w|
∣w∣ 字典序
≤
w
\le w
≤w 的最大的 necklace。记作
P
L
(
w
)
PL(w)
PL(w)
-
P
L
(
w
)
PL(w)
PL(w) 形如
P
r
e
(
w
,
i
?
1
)
+
P
(
w
i
)
+
z
∣
w
∣
?
i
Pre(w,i-1)+P(w_i)+z^{|w|-i}
Pre(w,i?1)+P(wi?)+z∣w∣?i,其中
P
(
c
)
P(c)
P(c) 表示比
c
c
c 小的最大字符,故我们有
∣
w
∣
2
|w|^2
∣w∣2 的做法,即每次判断是不是 necklace。
考虑优化判断的过程,只需要判断
P
r
e
(
w
,
i
?
1
)
+
P
(
w
i
)
Pre(w,i-1)+P(w_i)
Pre(w,i?1)+P(wi?) 是不是近似 Lyndon 串即可,用一次 Duval 算法就可以解决。
Lyndon 串计数: 设
P
(
n
)
,
L
(
n
)
P(n),L(n)
P(n),L(n) 表示本源串和 Lyndon 串的数量,有
L
(
n
)
=
1
n
P
(
n
)
L(n)=\frac 1n P(n)
L(n)=n1?P(n),且
Σ
n
=
∑
d
∣
n
P
(
d
)
\Sigma^n=\sum _{d\mid n}P(d)
Σn=∑d∣n?P(d),那么
L
(
n
)
=
1
n
∑
d
∣
n
μ
(
n
d
)
Σ
d
L(n)=\frac 1n \sum_{d\mid n}\mu(\frac nd)\Sigma^d
L(n)=n1?∑d∣n?μ(dn?)Σd。
Lyndon 串排名: 设
P
(
d
)
,
P
′
(
d
)
P(d),P'(d)
P(d),P′(d) 表示满足
u
^
n
/
d
≤
w
\hat u^{n/d}\le w
u^n/d≤w 的任意串
u
u
u 的数量,以及本源串
u
u
u 的数量。
r
a
n
k
=
1
n
P
′
(
n
)
,
P
(
x
)
=
∑
d
∣
x
P
′
(
d
)
→
r
a
n
k
=
1
n
∑
d
∣
n
μ
(
n
d
)
×
P
(
d
)
rank=\frac 1nP'(n),P(x)=\sum_{d\mid x}P'(d)\to rank=\frac 1n\sum_{d\mid n} \mu(\frac nd)\times P(d)
rank=n1?P′(n),P(x)=∑d∣x?P′(d)→rank=n1?∑d∣n?μ(dn?)×P(d)。 容易发现
P
(
d
)
P(d)
P(d) 等价与
u
^
≤
P
r
e
(
w
,
d
)
\hat u\le Pre(w,d)
u^≤Pre(w,d) 的任意串数量。 识别自动机: KMP 的改版,当转移字符等于
w
i
w_i
wi? 时,到
i
+
1
i+1
i+1,小于
w
i
w_i
wi? 时到
n
n
n,否则到 0。
- 性质:
w
w
w 是 necklace,
u
^
≤
w
,
∣
u
∣
=
∣
w
∣
=
n
\hat u\le w,|u|=|w|=n
u^≤w,∣u∣=∣w∣=n 当且仅当
u
2
u^{2}
u2 中存在一个不为
w
w
w 真前缀的子串
v
v
v 满足
v
≤
w
v\le w
v≤w。
- 性质: 发现对于 necklace 的识别自动机,它和 KMP 自动机一样。
对于计算
P
(
n
)
P(n)
P(n),我们只需要考虑不能转移到
n
n
n 的点有多少,我们会发现,考虑串
u
∞
u^{\infty}
u∞ 对于充分打大的
j
j
j,
j
j
j 转移到的点和
j
+
∣
u
∣
j+|u|
j+∣u∣ 转移到的是一样的。 我们定义
j
∣
u
∣
j|u|
j∣u∣ 转移到的点
t
t
t 为这个串的起始点,现在就是要求环的数量。设
f
j
f_j
fj? 为长为
j
j
j 的环的数量,枚举第一个环
j
j
j,有
f
i
=
∑
j
=
1
m
i
n
(
n
?
1
,
i
)
b
j
f
i
?
j
f_i=\sum_{j=1}^{min(n-1,i)} b_jf_{i-j}
fi?=∑j=1min(n?1,i)?bj?fi?j?,其中
b
j
b_j
bj? 表示从这个点转移到 0 的边数。容易发现可以使用多项式求逆来解决。于此同时,答案为
∑
i
=
1
n
?
1
i
×
b
i
×
f
n
?
i
\sum_{i=1}^{n-1} i\times b_i\times f_{n-i}
∑i=1n?1?i×bi?×fn?i?。注意到也可以使用线性递推做到
O
(
n
log
?
n
log
?
m
)
O(n\log n\log m)
O(nlognlogm) 的复杂度。
|