简要且不一定加以证明地记录某些字符串理论中的一些结论。
翻译:不是给你看的,是给我自己看的(
Lyndon 分解 - Duval 算法
Lyndon 分解的定义略。
算法的流程是维护三个指针 \(i,j,k\) 形成的循环不变式:
\(s[1\dots i-1] = s_1 s_2 \dots s_g\) 是已经确定的分解。
\(s[i\dots k-1] = t^h + v\) 是待定的分解,其中 \(t\) 是一个 Lyndon Word,\(h > 1\),\(v\) 是 \(t\) 的真前缀,且 \(s_g \ge s[i\dots k-1]\)。
同时维护 \(j = k - |t|\),考虑 \(s[k]\),分类讨论
\(s[j]=s[k]\),则周期继续维持,\(j \gets j+1,k \gets k+1\)。
\(s[j]<s[k]\),\(v + s[k]\) 为 Lyndon Word,将 \(t^h + v + s[k]\) 合并为一个新的 Lyndon Word \(t\),即令 \(j\gets i\)。
\(s[j]>s[k]\),确定 \(t^h\) 的分解,算法从 \(v\) 的开头继续。
代码:
1 |
|
Runs
The Runs Theorem
\[ \rho(n) < n,\sigma(n) < 3n-3 \]
求 Runs
令 \(<_0,<_1\) 为 \(\Sigma\) 上两种相反的全序关系,类似地定义到 \(\Sigma*\) 上的字典序关系。
对于 \(\ell \in \{0,1\}\),令 \(\overline \ell = 1-\ell\)。
简要概括:对 \(\ell \in \{0,1\}\) 求出每个后缀在 \(<_{\ell}\) 意义下的最长 Lyndon Word 前缀。枚举一个作为某个 Lyndon Root 求前后最长可扩展的长度,判断加起来是否不小于 \(p\)。去重。
代码:
1 |
|
Primitive Square
Three Square Lemma
对 \(u,v,w\) 满足 \(uu\) 是 \(vv\) 的前缀,\(vv\) 是 \(ww\) 的前缀,且 \(uu\) 是本原平方串,有 \(|u|+|v| \le w\)。
推论 1
本原平方串的个数是 \(O(n \log n)\) 级别的。
推论 2
本质不同的本原平方串的个数是 \(O(n)\) 级别的。
推论 3
一个字符串所有 run \(r = (l,r,p)\) 的 \(r-l+2-2p\) 之和是 \(O(n \log n)\) 级别的。