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,