Lyndon 分解 小记
参考:IOI2021 国家集训队论文 胡昊
以下表示字符串的下标都是 \([0,|S|-1]\),设 \(n\) 为最后一项下标也就是 \(|S|-1\)
定义
- 定义简单串 \(S\) 指 \(\forall i\in [1,|S|-1],S[i,n]>S\),也即 任意真后缀大于 \(S\)
- 定义串 \(S\) 的 lyndon 分解为 \(S=w_1w_2…w_m\),其中满足 \(w_i\ge w_{i+1}\) 且所有的 \(w_i\) 均为简单串
性质
-
串 \(S\) 是简单串,当且仅当它小于所有与它循环同构的串
-
若 \(S\) 是简单串,破环成链之后 \(i\ge 1,S[i,n]>S\implies S[i,n+i-1]>S\)
-
若 \(S\) 小于与它循环同构的所有串,则不妨考虑反证法,设:
\(S=A+B\),其中 \(B\) 是最短的 \(S\ge B\) 的后缀,则根据假设,\(BA>S\),也即 \(BA>AB\ge B\)
这可以导出 \(A,B\) 存在前缀关系
-
\(A\) 是 \(B\) 的前缀,不妨设 \(B=AC\),那么有 \(ACA>AAC\ge AC\implies CA>AC\ge C\)。
又因为 \(B\) 是所有串里面最短的,所以这个 \(C\) 应当满足 \(S<C\) 也就是 \(AC\le AAC<C\)
所以可以得到 \(C\le AC<C\),显然不成立
-
\(B\) 是 \(A\) 的前缀,不妨设 \(A=BC\),那么有
\(BBC>BCB\ge B\),也就有 \(BC>CB\)。
又因为 \(S=BCB<CBB\),这是矛盾的。
-
-
若 \(S+a\) 是简单串,则 \(b> a\),\(S+b\) 也是简单串
对于每个真后缀 \(T\),有 \(Tb>Ta>Sa,|Tb|<|Sa|\),所以对于 \(S\) 的每个真后缀与 \(S\) 比较的不同位置涉及不到最后一个位置,所以 \(Tb>Sb\)
-
Lyndon 分解是唯一的
不妨假设 \(S\) 存在两个 Lyndon 分解,我们删去两个分解开头相同的部分,只剩下 \(w_1w_2…w_m,w'_1w'_2…w'_{m'}\)
那么不妨设 \(|w_1|<|w'_1|\),则设 \(w_1=A,w'_1=AB,w_2=BC\),根据 \(w_2\le w_1\),以及循环同构最小,可以有:
\(BC\le A<AB<B\)
这显然矛盾
后缀 Lyndon 分解
考虑使用后缀数组对所有后缀进行排序,设 \(a_i=\min_{j>i,S[j,n]<S[i,n]}j\) 如果不存在设置 \(j=n+1=|S|\),这个可以利用数据结构轻松求出。
那么可以给出 Lyndon 分解为 \([0,a_0-1][a_0,a_{a_0}-1]…\)
证明感性?其实 \(w_i\ge w_{i+1}\) 是容易看出的,我们只需要证明 \(w_i\) 是简单串即可。这也是简单的,根据后缀排序可得。
前缀 Lyndon 分解-Duval 算法
定义近似简单串 \(S=w^kw_0\),其中 \(w^k\) 是 \(w\) 重复 \(k\) 次所得,且 \(w_0\) 是 \(w\) 的前缀。
显然简单串也是近似简单串。
考虑使用三个指针 \(i,j,k\) 表示:\([0,i-1]\) 已经处理,\([i,j-1]\) 是一个近似简单串 \(w^kw_0\),而 \(k\) 是 \(j-|w|\)。
分类讨论:
-
\(S_j=S_k\),显然直接扩展即可,\(j\leftarrow j+1,k\leftarrow k+1\)
-
\(S_j>S_k\),可以发现此时 \([i,j]\) 是一个简单串,可以看成近似简单串,也就是 \(j\leftarrow j+1,k\leftarrow i\)
-
\(S_j<S_k\),可以发现此时 \(w_0S_j\) 已经小于 \(w\) 了,直接把 \(w^x\) 划出来变成一个新的 \(w\)
也就是不断填入 \(w,|w|=j-k\),直到 \(i'> k\)
\(i\leftarrow i',j\leftarrow i+1,k\leftarrow i\),因为单个字符也算近似简单串
咕了