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\),满足:

  1. \(w_1w_2\cdots w_k=s\)
  2. \(\forall i,w_i\) 是 Lyndon Word;
  3. \(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.一些性质

  1. \(a,b\in \mathbb L\) ,且 \(a<b\) ,则 \(ab\in \mathbb L\)
  2. Lyndon 分解存在且唯一。
  3. \(w_1\) 是最长的 Lyndon 前缀, \(w_k\) 是最长的 Lyndon 后缀。
  4. \(s\) 的最小后缀是 \(w_k\)
  5. 如果 \(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\)

下分三种情况讨论:

  1. \(s[k+1]=s[j+1]\),则令 \(k\gets k+1\)\(j\gets j+1\),周期 \(h\) 保持不变。
  2. \(s[k+1]>s[j+1]\),则根据性质五可得 \(vs[k+1]\) 是 Lyndon Word,
posted @ 2020-08-11 22:09  happydef  阅读(397)  评论(5编辑  收藏  举报