Lyndon分解 从 Lyndon 到 Runs
Lyndon 相关知识是大毒瘤。
——zght
1.一些定义
Lyndon Word:对于任意字符串 \(s\) 如果对任意后缀 \(S\),有$ S>s$,那么称 \(s\) 为Lyndon Word。
举个例子:\(\texttt{abcdefg}\) 是 Lyndon Word,而 \(\texttt{gfedcba}\) 不是。
定义 \(\mathbb L\) 表示 Lyndon Word 构成的集合。
定义 \(\Sigma\) 表示字符集,组成的字符串为 \(\Sigma^*\),组成的非空字符串为 \(\Sigma^+\)
Lyndon 分解:对于任意字符串 \(s\),如果存在一组字符串 \(w_1,w_2,\cdots,w_k\),满足:
- \(w_1w_2\cdots w_k=s\);
- \(\forall i,w_i\) 是 Lyndon Word;
- \(w_1\ge w_2\ge w_3\cdots w_k\);
则称 \(\{w_i|1\le i\le k\}\) 为 \(s\) 的 Lyndon 分解,并记 \(\text{CFL}(s)=\{w_i|1\le i\le k\}\) 。
2.一些性质
- 若 \(a,b\in \mathbb L\) ,且 \(a<b\) ,则 \(ab\in \mathbb L\)。
- Lyndon 分解存在且唯一。
- \(w_1\) 是最长的 Lyndon 前缀, \(w_k\) 是最长的 Lyndon 后缀。
- \(s\) 的最小后缀是 \(w_k\)。
- 如果 \(sc\) 是某个 Lyndon Word 的前缀,\(c\) 是单个字符,则对任意字符 \(d>c\),有 \(sd\) 是 Lyndon Word。
3. Duval's Algorithm
下记 \((s)^k\) 表示 \(s\) 重复 \(k\) 次的结果,例如 \((\texttt{ab})^5=\texttt{ababababab}\) 。
维护三个变量 \(i,j,k\),使得 \(s[1\dots i]=s_1s_2\dots s_g\) 是已经求得的 Lyndon 分解,且 \(s[i+1\dots k]=t^hv\),其中 \(h>1\) 是尚未求出的 Lyndon 分解,使得 \(v\) 是 \(t\) 的真前缀,且 \(s_g>s[i+1\dots k]\)。令 \(j=k-h\)。
下分三种情况讨论:
- 若 \(s[k+1]=s[j+1]\),则令 \(k\gets k+1\),\(j\gets j+1\),周期 \(h\) 保持不变。
- 若 \(s[k+1]>s[j+1]\),则根据性质五可得 \(vs[k+1]\) 是 Lyndon Word,