Lyndon & Runs
更新于 2026/5/28 07:35:24
作者
command_block
读者可能需要前往 Border理论小记 学习相关知识,否则可能无法理解某些内容。
本文包含的内容 :
Lyndon 分解
Lyndon 树 (未完)
The Runs Theorem
本原平方串 primitive square
参考资料 :
其中,前者的部分内容是后者的翻译。
0. 初步的定义 & 约定
字符串一般记为小写字母,确定的字符用 abcdef \texttt{abcdef} abcdef 字体表示,单独的不定字符用 a ‾ \overline a a 表示。
对于字符串 s s s ,有如下概念。
长度 :记为 ∣ s ∣ |s| ∣ s ∣ ,在针对单串集中的讨论中也约定为 n n n 。( 本节下面一律有 n = ∣ s ∣ n=|s| n = ∣ s ∣ )
字符 :用 s [ i ] s[i] s [ i ] 表示串 s s s 的第 i i i 个字符。s s s 中的字符标号为 1 , 2 , … , n 1,2,\dots,n 1 , 2 , … , n 。
单个字符也被视作字符串。
字符集 : 记为 Σ s \Sigma_s Σ s 。
为了简化边界条件,若取到标号在 [ 1 , n ] [1,n] [ 1 , n ] 之外的字符,定义其不在字符集内。
字符串的比较 : 若 s s s 的字典序比 t t t 小,记为 s < t s<t s < t 。
若字符串集合 D D D 中的所有串都小于 s s s ,记为 D < s D<s D < s 。
类似地有 ≤ , > , ≥ \leq ,>,\geq ≤ , > , ≥ 。
子串 : s [ l , r ] s[l,r] s [ l , r ] 表示将 s [ l ] , s [ l + 1 ] , … , s [ r ] s[l],s[l+1],\dots,s[r] s [ l ] , s [ l + 1 ] , … , s [ r ] 顺次连接而成的字符串。
前缀&后缀 : 简记 s ⟨ i ] = s [ 1 , i ] , s [ i ⟩ = s [ i , n ] s\langle i]=s[1,i],\ s[i\rangle=s[i,n] s ⟨ i ] = s [ 1 , i ] , s [ i ⟩ = s [ i , n ] 。(注意里面填的是位置而非长度)
称一个前缀/后缀为严格的,当且仅当它 ≠ ≠ = 原串 s s s 。
记 p r e ( s ) {\rm pre}(s) pre ( s ) 为 s s s 的前缀集合, s u f ( s ) {\rm suf}(s) suf ( s ) 为 s s s 的后缀集合。
记 p r e ′ ( s ) {\rm pre}'(s) pre ′ ( s ) 为 s s s 的严格前缀集合, s u f ′ ( s ) {\rm suf}'(s) suf ′ ( s ) 为 s s s 的严格后缀集合。
出现位置 : 对于串 t t t ,记:
B e g s ( t ) {\rm Beg}_s(t) Beg s ( t ) 为 t t t 在 s s s 中所有出现位置的左端点集合。
E n d s ( t ) {\rm End}_s(t) End s ( t ) 为 t t t 在 s s s 中所有出现位置的右端点集合。
对于区间集合 L L L ,类似地记 :
B e g ( L ) {\rm Beg}(L) Beg ( L ) 为 L L L 的左端点集合。
E n d ( L ) {\rm End}(L) End ( L ) 为 L L L 的右端点集合。
字符串的拼接,幂 : 记 s t , s ⋅ t st,\ s\cdot t s t , s ⋅ t 为字符串 s , t s,t s , t 顺次连接而得的串。
定义 s k = s s … s ⏞ 共 k 个 s^k=\overbrace{ss\dots s}^{\text{共 k 个}} s k = ss … s 共 k 个 ,即 s s s 重复 k k k 次后形成的串。
循环节 p e r i o d \bf period period : 若对于所有 1 ≤ i ≤ n − c 1\leq i\leq n-c 1 ≤ i ≤ n − c ,均有 s [ i ] = s [ i + c ] s[i]=s[i+c] s [ i ] = s [ i + c ] ,则称 c c c 是 s s s 的一个循环节。
若 c ∣ n c|n c ∣ n 则称 c c c 为整周期。
记 p e r i o d ( s ) {\rm period}(s) period ( s ) 为 s s s 的循环节集合。
B o r d e r \bf Border Border : 若有 s ⟨ i ] = s [ n − i + 1 ⟩ ( 1 ≤ i < n ) s\langle i]=s[n-i+1\rangle\ (1\leq i<n) s ⟨ i ] = s [ n − i + 1 ⟩ ( 1 ≤ i < n ) (等于后缀的严格 前缀),则称之为 B o r d e r \rm Border Border ,简称为 B d \rm Bd Bd 。
记 B d ( s ) {\rm Bd}(s) Bd ( s ) 为 s s s 的 B d \rm Bd Bd 集合。( 注意 s ∉ B d ( s ) s\not\in {\rm Bd}(s) s ∈ Bd ( s ) )
B d \rm Bd Bd 和 p e r i o d \rm period period 是一一对应的。其中,一个长度为 k k k 的 B d \rm Bd Bd 对应一个长度为 n − k n-k n − k 的循环节。
L y n d o n W o r d \bf Lyndon\ Word Lyndon Word : 若字符串 s s s 的最小后缀是其本身,即 s < s u f ′ ( s ) s<{\rm suf}'(s) s < suf ′ ( s ) ,则称之为 L y n d o n W o r d \rm Lyndon Word LyndonWord ,简称为 L y \rm Ly Ly 。
另一个等价的定义 : s s s 是自己的所有循环位移中最小的一个。
例 : abc,ababc \texttt{abc,ababc} abc,ababc 是 L y \rm Ly Ly ,而 ba,acabc \texttt{ba,acabc} ba,acabc 不是。
R u n s \bf Runs Runs : 三元组 r = ( l , r , p ) {\bf r}=(l,r,p) r = ( l , r , p ) 是串 s s s 的一个 r u n \rm run run ,当且仅当 :
s [ l , r ] s[l,r] s [ l , r ] 的最小 循环节为 p p p ,满足 2 p ≤ ∣ s [ l , r ] ∣ = r − l + 1 2p\leq \big|s[l,r]\big|=r-l+1 2 p ≤ s [ l , r ] = r − l + 1
该循环不能延伸,即 s [ l − 1 ] ≠ s [ l + p − 1 ] , s [ r + 1 ] ≠ s [ r − p + 1 ] s[l-1]≠s[l+p-1],s[r+1]≠s[r-p+1] s [ l − 1 ] = s [ l + p − 1 ] , s [ r + 1 ] = s [ r − p + 1 ]
实数 e r = r − l + 1 p e_{{\bf r}}=\dfrac{r-l+1}{p} e r = p r − l + 1 被称为该 r u n \rm run run 的指数。
记 R u n s ( s ) {\rm Runs}(s) Runs ( s ) 为 s s s 的所有 r u n \rm run run 构成的集合。
ρ r u n ( n ) ρ_{\rm run}(n) ρ run ( n ) 表示长度为 n n n 的字符串中至多含有的 r u n \rm run run 个数。
σ r u n ( n ) σ_{\rm run}(n) σ run ( n ) 表示长度为 n n n 的字符串的 r u n \rm run run 的指数和的最大值。
为了方便,上面的约定了一些不正规的缩写,相信大家很容易就能感性理解。(逃)
1. Lyndon Word 的性质
在不能理解证明的时候,建议画图。在一些关键的地方我也会制作图示。
Δ \color{blue}\bf\Delta Δ 定理(1.1) : 对于任意一个 L y s {\rm Ly}\ s Ly s ,其不存在 B d \rm Bd Bd 。
若存在某个 B d t {\rm Bd}\ t Bd t ,则显然 t < s t<s t < s ,同时 t t t 又是 s s s 的严格后缀,和 L y \rm Ly Ly 的定义矛盾。
Δ \color{blue}\bf\Delta Δ 定理(1.2) : 对于 L y s = a b {\rm Ly}\ s=ab Ly s = ab ,有 a < b a<b a < b 。(a , b a,b a , b 均非空)
由定义有 a b < b ab<b ab < b ,且显然有 a < a b a<ab a < ab ,所以 a < b a<b a < b 。
引理(1.1) : 若 a a a 不是 b b b 的前缀,则 a c 1 < b c 2 ⇔ a < b ac_1<bc_2\Leftrightarrow a<b a c 1 < b c 2 ⇔ a < b 。证明较为显然,从略。
Δ \color{blue}\bf\Delta Δ 定理(1.3) : 对于 L y b {\rm Ly}\ b Ly b 和另一个串 a a a , 有 a < b ⇔ a b < b a<b\Leftrightarrow ab<b a < b ⇔ ab < b
由 引理(1.1) ,若 a a a 不是 b b b 的前缀 ,则结论成立。
现在针对 L y \rm Ly Ly 来证明 a a a 恰为 b b b 前缀的情况。令 b = a t b=at b = a t 。
显然有 a < b a<b a < b ,所以必要性不必证明。
假设 a t = b < a b at=b<ab a t = b < ab ,则有 t < b t<b t < b ,由于 t t t 是 b b b 的一个后缀,这违反 L y \rm Ly Ly 的定义,矛盾。
Δ \color{blue}\bf\Delta Δ 定理(1.4) : s s s 是 L y \rm Ly Ly 当且仅当 s = a b s=ab s = ab ,a < b a<b a < b 且 a , b a,b a , b 均为 L y \rm Ly Ly 。(a , b a,b a , b 均非空,∣ s ∣ ≥ 2 |s|\geq 2 ∣ s ∣ ≥ 2 )
这个定理告诉我们,L y \rm Ly Ly 总是由两个更小的 L y \rm Ly Ly 按字典序拼成的。
充分性 : ( a < b \big(a<b ( a < b 且 a , b a,b a , b 均为 L y ) ⇒ ( a b {\rm Ly}\big)\Rightarrow\big(ab Ly ) ⇒ ( ab 是 L y ) \rm Ly\big) Ly ) 。
a b ab ab 的严格后缀可以分为 s u f ′ ( a ) b , b , s u f ′ ( b ) {\rm suf}'(a)b,\ b,\ {\rm suf}'(b) suf ′ ( a ) b , b , suf ′ ( b ) 两个部分。
由 a < s u f ′ ( a ) a<{\rm suf}'(a) a < suf ′ ( a ) ,显然有 a b < s u f ′ ( a ) b ab<{\rm suf}'(a)b ab < suf ′ ( a ) b 。
由 定理(1.3) 有 a b < b < s u f ′ ( b ) ab<b<{\rm suf}'(b) ab < b < suf ′ ( b ) ,证毕。
必要性 : ( s \big(s ( s 是 L y ) ⇒ ( {\rm Ly}\big)\Rightarrow \big( Ly ) ⇒ ( 存在 i i i 使得 s ⟨ i − 1 ] < s [ i ⟩ s\langle i-1]<s[i\rangle s ⟨ i − 1 ] < s [ i ⟩ 且 s ⟨ i − 1 ] , s [ i ⟩ s\langle i-1],s[i\rangle s ⟨ i − 1 ] , s [ i ⟩ 均为 L y ) \rm Ly\big) Ly ) 。 (证明较为复杂,可暂时跳过)
找出 s s s 的最小严格后缀 s [ i ⟩ s[i\rangle s [ i ⟩ 。
Part1. 由 定理 (1.2) 即可得到 s ⟨ i − 1 ] < s [ i ⟩ s\langle i-1]<s[i\rangle s ⟨ i − 1 ] < s [ i ⟩ 。
Part2. s [ i ⟩ s[i\rangle s [ i ⟩ 为 L y \rm Ly Ly
由最小严格后缀,不存在其他严格后缀比它还小,所以其是 L y \rm Ly Ly 。
Part3. s ⟨ i − 1 ] s\langle i-1] s ⟨ i − 1 ] 为 L y \rm Ly Ly
假设前缀 s ⟨ i − 1 ] s\langle i-1] s ⟨ i − 1 ] 存在长为 k k k 的 B d \rm Bd Bd 。显然 k + 1 < i k+1<i k + 1 < i 。
由最小严格后缀,可得 s [ k + 1 ⟩ > s [ i ⟩ s[k+1\rangle>s[i\rangle s [ k + 1 ⟩ > s [ i ⟩ ,又因为 s [ 1 , k ] = s [ i − k , i − 1 ] s[1,k]=s[i-k,i-1] s [ 1 , k ] = s [ i − k , i − 1 ] ,在这两个串后面分别接上不等式中的串,则有 s > s [ i − k ⟩ s>s[i-k\rangle s > s [ i − k ⟩ ,与 L y \rm Ly Ly 的定义矛盾。所以, s ⟨ i − 1 ] s\langle i-1] s ⟨ i − 1 ] 没有 B d \rm Bd Bd 。
对于 1 < j ≤ i − 1 1<j\leq i-1 1 < j ≤ i − 1 ,考虑 $s\langle i-1]s[i\rangle=s<s[j\rangle=s[j,i-1]s[i\rangle$。
由 引理(1.1) ,因为 s ⟨ i − 1 ] s\langle i-1] s ⟨ i − 1 ] 无 B d \rm Bd Bd ,即 s [ j , i − 1 ] s[j,i-1] s [ j , i − 1 ] 不是 s ⟨ i − 1 ] s\langle i-1] s ⟨ i − 1 ] 的前缀,可得 s [ j , i − 1 ] > s ⟨ i − 1 ] s[j,i-1]>s\langle i-1] s [ j , i − 1 ] > s ⟨ i − 1 ] ,则 s ⟨ i − 1 ] s\langle i-1] s ⟨ i − 1 ] 是 L y \rm Ly Ly 。
Δ \color{blue}\bf\Delta Δ 定理(1.5) : 若字符串 s s s 和字符 x ‾ \overline x x 满足 s x ‾ s\overline x s x 是某个 L y \rm Ly Ly 的前缀,则对于 y ‾ > x ‾ \overline y>\overline x y > x ,s y ‾ s\overline y s y 是 L y \rm Ly Ly 。
设 s x ‾ t s\overline xt s x t 是 L y \rm Ly Ly ,考虑 1 < j ≤ ∣ s ∣ 1<j\leq |s| 1 < j ≤ ∣ s ∣ 。
若 s [ j ⟩ x ‾ s[j\rangle \overline x s [ j ⟩ x 是 s s s 的前缀,则由 s [ j ⟩ x ‾ < s [ j ⟩ y ‾ s[j\rangle \overline x<s[j\rangle \overline y s [ j ⟩ x < s [ j ⟩ y (两者互不为前缀)使用 引理(1.1) 能导出 s y ‾ < s [ j ⟩ y ‾ s\overline y<s[j\rangle \overline y s y < s [ j ⟩ y 。
若 s [ j ⟩ x ‾ s[j\rangle \overline x s [ j ⟩ x 不是 s s s 的前缀,考虑 s [ j ⟩ x ‾ t > s x ‾ t s[j\rangle \overline xt>s\overline xt s [ j ⟩ x t > s x t ,使用 引理(1.1) 替换后面的东西,即得 s [ j ⟩ y ‾ > s y ‾ s[j\rangle \overline y>s\overline y s [ j ⟩ y > s y 。
综上,总有 s y ‾ < s [ j ⟩ y ‾ s\overline y<s[j\rangle \overline y s y < s [ j ⟩ y ,证毕。
⊛ \large\color{blue}\bf\circledast ⊛ 定义 : 串的 L y n d o n \rm Lyndon Lyndon 分解
将字符串 s s s 分解成 s 1 , s 2 … s m s_1,s_2\dots s_m s 1 , s 2 … s m ,满足 s 1 , s 2 , … , s m s_1,s_2,\dots,s_m s 1 , s 2 , … , s m 均为 L y \rm Ly Ly ,且 s 1 ≥ s 2 ≥ ⋯ ≥ s m s_1\geq s_2\geq \dots\geq s_m s 1 ≥ s 2 ≥ ⋯ ≥ s m 。
Δ \color{blue}\bf\Delta Δ 定理(1.6) : L y \rm Ly Ly 分解唯一
假设 s s s 有两种 L y \rm Ly Ly 分解 : s = s 1 s 2 … s i … s m s=s_1s_2\dots s_i\dots s_m s = s 1 s 2 … s i … s m 且 s = s 1 ′ s 2 ′ … s i ′ … s m ′ s=s_1's_2'\dots s_i'\dots s_m' s = s 1 ′ s 2 ′ … s i ′ … s m ′ 。
设 i i i 为第一个满足 s i ≠ s i ′ s_i≠s_i' s i = s i ′ 的,不妨设 ∣ s i ∣ > ∣ s i ′ ∣ |s_i|>|s_i'| ∣ s i ∣ > ∣ s i ′ ∣ ,且 s i = s i ′ s i + 1 ′ . . . s k ′ s k + 1 ′ ⟨ j ] s_i=s_i's_{i+1}'...s_k's_{k+1}'\langle j] s i = s i ′ s i + 1 ′ ... s k ′ s k + 1 ′ ⟨ j ] 。
有 $s_i<s_{k+1}'\langle j]\leq s_{k+1}'\leq s_{k}'\leq ...\leq s_i'<s_i$ ,矛盾。
Δ \color{blue}\bf\Delta Δ 定理(1.7) : L y \rm Ly Ly 分解必然存在
开始时将 s s s 分解为 n n n 个串,每个串都只有一个字符。显然,单字符都是 L y \rm Ly Ly 。
接下来,若相邻的两个串满足 s i < s i + 1 s_i<s_{i+1} s i < s i + 1 ,则合并。由 定理(1.4) ,合并后仍是 L y \rm Ly Ly 。
容易发现,合并不会一直进行下去,停止时得到的就是 L y \rm Ly Ly 分解。
2. 求 Lyndon 分解 : Duval 算法
前面在证明 L y \rm Ly Ly 分解存在性时,已经给出了一个构造,不过时间复杂度还不能令人满意。
不难发现,对于串 s s s ,其唯一 L y \rm Ly Ly 后缀即为其最小后缀。每次取出最小后缀即可得到 L y \rm Ly Ly 分解。
这可以利用后缀数组求解,不过这样太复杂了。
接下来介绍 D u v a l \rm Duval Duval 算法,其可以在 O ( n ) O(n) O ( n ) 的时间内算得一个串的 L y \rm Ly Ly 分解。且代码实现非常简短。
其思想是 : 不断求一个串的最长 L y \rm Ly Ly 前缀。
Δ \color{blue}\bf\Delta Δ 定理(2.1) : 设 s = u k u ′ a ‾ s=u^ku'\overline a s = u k u ′ a ,其中 u u u 是 L y \rm Ly Ly ,u ′ u' u ′ 是 u u u 的严格前缀,a ‾ \overline a a 是某个字符,且 ≠ u [ ∣ u ′ ∣ + 1 ] ≠u\big[|u'|+1\big] = u [ ∣ u ′ ∣ + 1 ] (接不上 u u u 的循环)。
① 若 a ‾ > u [ ∣ u ′ ∣ + 1 ] \overline a>u\big[|u'|+1\big] a > u [ ∣ u ′ ∣ + 1 ] ,根据 定理(1.5) ,这说明 u ′ a ‾ u'\overline a u ′ a 是 L y \rm Ly Ly 。
由于此时 u < u ′ a ‾ u<u'\overline a u < u ′ a ,可以将前面的 t c t^c t c 全都合并。所以 s s s 已经是一个 L y \rm Ly Ly 串。
② 若 a ‾ < u [ ∣ u ′ ∣ + 1 ] \overline a<u\big[|u'|+1\big] a < u [ ∣ u ′ ∣ + 1 ] ,所有以 s s s 开头的字符串,最长 L y \rm Ly Ly 前缀是 u u u 。
若选择 u k u ′ u^ku' u k u ′ 的长度大于 ∣ u ∣ |u| ∣ u ∣ 的前缀,则会产生 B d \rm Bd Bd ,矛盾。
若选择 u k u ′ a ‾ t u^ku'\overline a t u k u ′ a t ,由于 u ′ a ‾ u'\overline a u ′ a 不是 u u u 的前缀,使用 引理(1.1) 可得 $u'\overline a <u\Rightarrow u'\overline a t<u^ku'\overline a t$ ,则显然不是 L y \rm Ly Ly 。
.D u v a l \rm Duval Duval 算法的主要过程是,在字符串中不断迭代,并不断保持 定理(2.1) 的形式。
维护两个指针 p , i p,i p , i ,其中 s [ 1 , p − 1 ] s[1,p-1] s [ 1 , p − 1 ] 的分解已经确定 ,s [ p , i ] s[p,i] s [ p , i ] 是目前的一段待定串。
维护 s [ p , i ] s[p,i] s [ p , i ] 的 L y \rm Ly Ly 循环,设 s [ p , i ] = u c u ′ s[p,i]=u^cu' s [ p , i ] = u c u ′ ,其中 t t t 是一个 L y \rm Ly Ly 串,u ′ u' u ′ 是 u u u 的严格前缀。需要维护 ∣ u ∣ , c , ∣ u ′ ∣ |u|,c,|u'| ∣ u ∣ , c , ∣ u ′ ∣ 。
当加入字符 s [ i + 1 ] s[i+1] s [ i + 1 ] 时 :(若 k + 1 > n k+1>n k + 1 > n 则 s [ k + 1 ] = − ∞ s[k+1]=-∞ s [ k + 1 ] = − ∞ )
① s [ i + 1 ] = s [ i − ∣ u ∣ + 1 ] s[i+1]=s[i-|u|+1] s [ i + 1 ] = s [ i − ∣ u ∣ + 1 ] : 这说明目前的 L y \rm Ly Ly 循环可以延续下去。
② s [ i + 1 ] > s [ i − ∣ u ∣ + 1 ] s[i+1]>s[i-|u|+1] s [ i + 1 ] > s [ i − ∣ u ∣ + 1 ] : 根据 定理(2.1) ,s [ p , i + 1 ] s[p,i+1] s [ p , i + 1 ] 为 L y \rm Ly Ly ,也是新的 u u u 。
③ s [ i + 1 ] < s [ i − ∣ u ∣ + 1 ] s[i+1]<s[i-|u|+1] s [ i + 1 ] < s [ i − ∣ u ∣ + 1 ] : 根据 定理(2.1) ,此时的最长 L y \rm Ly Ly 前缀是 u u u ,我们在确定的分解中加入 c c c 个 u u u ,然后令 i i i 回到新的 p p p 处重来。
不难发现, i + p i+p i + p 总是递增。①② 中仅有 i i i 增加,③ 中由于 ∣ u ′ ∣ < ∣ u k ∣ |u'|<|u^k| ∣ u ′ ∣ < ∣ u k ∣ 所以 p p p 的增加量大于 i i i 的减少量。
所以,算法的时间复杂度为 O ( n ) O(n) O ( n ) 。
#include<cstring>
#include<cstdio>
char s[5005000];
int main()
{
scanf("%s",s+1);
int n=strlen(s+1);
int p=0,i=1,u=1,c=1,u2=0,ans=0;
for (;i<=n;i++){
if (s[i+1]==s[i-u+1]){
u2++;
if (u2==u){c++;u2=0;}
}
else if (s[i+1]>s[i-u+1]){
u=i+1-p; u2=0; c=1;
}
else if (s[i+1]<s[i-u+1]){
for (int t=1;t<=c;t++)
{p+=u;ans^=p;}
i=p; u=1; c=1; u2=0;
}
}printf("%d",ans);
return 0;
}
评测记录
可以利用 D u v a l \rm Duval Duval 算法求出 s s s 的每个前缀的最小/最大后缀。
还可以求 s s s 的最小表示,即求出最小的 T = S [ i ⟩ S ⟨ i − 1 ] T=S[i\rangle S\langle i-1] T = S [ i ⟩ S ⟨ i − 1 ] 。
令 s ′ = s + s s'=s+s s ′ = s + s ,求出 s ′ s' s ′ 的 L y \rm Ly Ly 分解,找到起始位置 ≤ ∣ s ∣ \leq |s| ≤ ∣ s ∣ 且最小的 L y \rm Ly Ly 串,即为最小表示的开头。
先咕了。
3. Runs 的性质 : The Runs Theorem
Δ \color{blue}\bf\Delta Δ 定理(3.1) : 两个周期为 p p p 的 r u n \rm run run 的交长度 < p <p < p 。
若交的长度 ≥ p \geq p ≥ p ,在交中选出一个循环节扩展,能导出矛盾。
⊛ \large\color{blue}\bf\circledast ⊛ 定义 : r u n \rm run run 的 Lyndon Root \text{Lyndon Root} Lyndon Root (简称为 L y R o o t \rm LyRoot LyRoot )
令 r = ( l , r , p ) {\bf r}=(l,r,p) r = ( l , r , p ) 是串 s s s 的一个 r u n \rm run run 。
一个长为 p p p 的区间 [ i , j ] [i,j] [ i , j ] 被称为 L y R o o t \rm LyRoot LyRoot ,当且仅当 s [ i , j ] s[i,j] s [ i , j ] 是 L y \rm Ly Ly ,且 l ≤ i ≤ j ≤ r l\leq i\leq j\leq r l ≤ i ≤ j ≤ r 。
也就是说,L y R o o t \rm LyRoot LyRoot 是 r u n \rm run run 的循环节 中最小的那些。
显然,对于任意的一个 r {\bf r} r ,其至少有一个 L y R o o t \rm LyRoot LyRoot (循环节的最小表示)。且所有 L y R o o t \rm LyRoot LyRoot 代表的串相等(只是位置不同)。
Δ \color{blue}\bf\Delta Δ 定理(3.2) : $\text{The Runs Theorem} : ρ_{\rm run}(n)<n,σ_{\rm run}(n)\leq 3n-3$
证明是一段漫长的旅程,请诸位耐心跋涉。路虽艰远,行之必达。
下面的定理理解跨度较大,叙述有些碎片化,正如不完整的拼图那样,让人一时摸不着头绪。
但在拼图完整的那一刻,将会呈现优美的宏观结构,此时就能更清晰的洞察 : 每一块拼图都有其意义和解释。
⊛ \large\color{blue}\bf\circledast ⊛ 定义 : 字典序重载
对于 Σ \Sigma Σ 中的一个全序关系 < < < ,可以定义出字典序 < < < 。
假设有 Σ \Sigma Σ 中两种相反的全序关系 < 0 , < 1 <_0,<_1 < 0 , < 1 ,可以定义出两种相反的字典序 < 0 , < 1 <_0,<_1 < 0 , < 1 。你可以认为 < 0 <_0 < 0 就是普通的字典序。
为了避免矛盾,在字符串比较时,我们自动在串后面填充无限个占位符 $ ∉ Σ \texttt{\textdollar} \not\in \Sigma $ ∈ Σ 。
对于 a ‾ ∈ Σ \overline a\in\Sigma a ∈ Σ 约定 $ < 0 a ‾ \texttt{\textdollar}<_0\overline a $ < 0 a (普通字典序中空位最小),a ‾ < 1 $ \overline a<_1\texttt{\textdollar} a < 1 $ (反字典序中空位最大)
对于不同的字典序比较方法,可以定义出不同的 L y \rm Ly Ly 。
对 f ∈ { 0 , 1 } f\in\{0,1\} f ∈ { 0 , 1 } ,记 ¬ f = 1 − f \neg f=1-f ¬ f = 1 − f 。
⊛ \large\color{blue}\bf\circledast ⊛ 定义 : 对于串 s s s ,定义 L y s , f ( i ) = [ i , j ] {\rm Ly}_{s,f}(i)=[i,j] Ly s , f ( i ) = [ i , j ] 其中 j = max { j ∣ s [ i , j ] 是关于 < f 的 L y } j=\max\{j|s[i,j]\text{是关于}<_f\text{的}{\rm Ly}\} j = max { j ∣ s [ i , j ] 是关于 < f 的 Ly }
也就是说,在 < f <_f < f 意义下,串 s s s 中起始位置为 i i i 的最长的 L y \rm Ly Ly 子串。
Δ \color{blue}\bf\Delta Δ 定理(3.3) : 对于L y s , f ( i ) {\rm Ly}_{s,f}(i) Ly s , f ( i ) ,有且仅有一个 f ∈ { 0 , 1 } f\in\{0,1\} f ∈ { 0 , 1 } 使得 ${\rm Ly}_{s,f}(i)=[i,i],{\rm Ly}_{s,\neg f}(i)=[i,j]\ (j>i)$
也就是说,正反两种字典序之中,只有一个能导出非平凡 L y \rm Ly Ly 子串。
令 k = min { k ∣ s [ k ] ≠ s [ i ] , k > i } k=\min\{k|s[k]≠s[i],k>i\} k = min { k ∣ s [ k ] = s [ i ] , k > i } (第一个不同字符,由于串末有 $ \texttt{\textdollar} $ ,必然能找到),找出 f f f 满足 s [ k ] < f s [ i ] s[k]<_fs[i] s [ k ] < f s [ i ] 。
由 定理(2.1) ,不难得到 L y s , f ( i ) = [ i , i ] {\rm Ly}_{s,f}(i)=[i,i] Ly s , f ( i ) = [ i , i ] ,以及 L y s , ¬ f ( i ) = [ i , j ] , j ≥ k > i {\rm Ly}_{s,\neg f}(i)=[i,j],j\geq k>i Ly s , ¬ f ( i ) = [ i , j ] , j ≥ k > i (已经有 s [ i , k ] s[i,k] s [ i , k ] 作为 L y \rm Ly Ly 前缀)。
Δ \color{blue}\bf\Delta Δ 定理(3.4) : 令 r = ( l , r , p ) {\bf r}=(l,r,p) r = ( l , r , p ) 是串 s s s 的一个 r u n \rm run run ,找出 f ∈ { 0 , 1 } f\in\{0,1\} f ∈ { 0 , 1 } 满足 s [ r + 1 ] < f s [ r + 1 − p ] s[r+1]<_fs[r+1-p] s [ r + 1 ] < f s [ r + 1 − p ] ,则 r r r 的所有关于 < f <_f < f 的 L y R o o t λ = [ i , j ] {\rm LyRoot}\ λ=[i,j] LyRoot λ = [ i , j ] 都与 L y s , f ( i ) {\rm Ly}_{s,f}(i) Ly s , f ( i ) 相等。
我们知道 L y R o o t \rm LyRoot LyRoot 就是 r {\bf r} r 的 L y \rm Ly Ly 循环节,设一个循环节为 u u u ,将 s [ l , r ] s[l,r] s [ l , r ] 写作 u k u ′ u^ku' u k u ′ ,其中 u ′ u' u ′ 是 u u u 的一个严格前缀。
不难发现,该定理就是 定理(2.1) 的体现。
由 定理(3.3) ,如果使用 < ¬ f <_{\neg f} < ¬ f ,那么总有 L y s , ¬ f ( i ) = [ i , i ] {\rm Ly}_{s,\neg f}(i)=[i,i] Ly s , ¬ f ( i ) = [ i , i ] ,没多大意义。
因此,f f f 有其特殊性,记 < f <_f < f 为 r {\bf r} r 的“正序”。
⊛ \large\color{blue}\bf\circledast ⊛ 定义 : 对于 r u n r = ( l , r , p ) {\rm run}\ {\bf r}=(l,r,p) run r = ( l , r , p ) ,记 ${\rm LyR}({\bf r})=\{λ=[i,j]\big|λ\text{为}{\bf r}\text{的关于}<_f\text{的}{\rm LyRoot},i≠l\}$,其中 f f f 是 r {\bf r} r 的正序。
即 L y R ( r ) {\rm LyR}({\bf r}) LyR ( r ) 表示 r r r 的所有正序的 L y R o o t \rm LyRoot LyRoot ,但要除去开头位置 l l l 出开始的(如果有的话)。
显然 $|{\rm LyR}({\bf r})|\geq \lfloor e_{\bf r}-1\rfloor\geq 1$。
Δ \color{blue}\bf\Delta Δ 定理(3.5) : 对于串 s s s 的两个不同的 r u n r = ( l , r , p ) , r ′ = ( l ′ , r ′ , p ′ ) {\rm run}\ {\bf r}=(l,r,p),{\bf r}'=(l',r',p') run r = ( l , r , p ) , r ′ = ( l ′ , r ′ , p ′ ) ,有 ${\rm Beg}({\rm LyR}({\bf r}))∩{\rm Beg}({\rm LyR}({\bf r}'))=\varnothing$。
假设存在 $i\in {\rm Beg}({\rm LyR}({\bf r}))∩{\rm Beg}({\rm LyR}({\bf r}'))$ ,且有 ${\rm LyRoot}\ λ=[i,j]\in{\rm LyR({\bf r})},\ λ=[i,j']\in{\rm LyR({\bf r}')}$
令 < f <_f < f 为 r {\bf r} r 的正序,则 λ = L y s , f ( i ) λ={\rm Ly}_{s,f}(i) λ = Ly s , f ( i ) 。
不难发现一定有 λ ≠ λ ′ λ≠λ' λ = λ ′ ( λ = λ ′ ⇒ r = r ′ λ=λ'\Rightarrow {\bf r}={\bf r}'
λ = λ ′ ⇒ r = r ′ ),所以只能是 λ ′ = L y s , ¬ f ( i ) λ'={\rm Ly}_{s,\neg f}(i) λ ′ = Ly s , ¬ f ( i ) 。
由 定理(3.3) ,λ , λ ′ λ,λ' λ , λ ′ 必有一个为 [ i , i ] [i,i] [ i , i ] ,不妨设 λ = [ i , i ] λ=[i,i] λ = [ i , i ] ,则有 j ′ > i j'>i j ′ > i 。
由于 s [ i , j ′ ] s[i,j'] s [ i , j ′ ] 是 L y \rm Ly Ly ,所以 s [ i ] ≠ s [ j ′ ] s[i]≠s[j'] s [ i ] = s [ j ′ ] 。
由 定理(3.4) 可知,r r r 的循环节 p = ∣ λ ∣ = 1 p=|λ|=1 p = ∣ λ ∣ = 1 , r ′ r' r ′ 的循环节 p ′ = ∣ λ ′ ∣ = j ′ − i + 1 p'=|λ'|=j'-i+1 p ′ = ∣ λ ′ ∣ = j ′ − i + 1 。
由 L y R ( r ) {\rm LyR}(r) LyR ( r ) 的定义,r , r ′ r,r' r , r ′ 的左端点都 < i <i < i 。
由周期性可推得 s [ i ] = s [ i − 1 ] = s [ i − 1 + ( j ′ − i + 1 ) ] = s [ j ′ ] s[i]=s[i-1]=s[i-1+(j'-i+1)]=s[j'] s [ i ] = s [ i − 1 ] = s [ i − 1 + ( j ′ − i + 1 )] = s [ j ′ ] ,矛盾。证毕。
定理(3.5) 表明,r u n \rm run run 们拥有两两不交的非空集合 B e g ( L y R ( r ) ) {\rm Beg}({\rm LyR}({\bf r})) Beg ( LyR ( r )) ,而且 1 1 1 不在其中,所以我们已经能够证明 ρ r u m ( n ) < n ρ_{\rm rum}(n)<n ρ rum ( n ) < n 。
进一步写出 $\sum\limits_{{\bf r}\in {{\rm Runs}(s)}}|{\rm LyR}({\bf r})|\leq n-1$。
由 $e_{\bf r}-2\leq \lfloor e_{\bf r}-1 \rfloor\leq |{\rm LyR}({\bf r})|$ ,得 $\sum\limits_{{\bf r}\in {{\rm Runs}(s)}}e_{\bf r}-2\leq \sum\limits_{{\bf r}\in {{\rm Runs}(s)}}|{\rm LyR}({\bf r})|\leq n-1$
结合 ∣ R u n s ( s ) ∣ ≤ n − 1 |{\rm Runs}(s)|\leq n-1 ∣ Runs ( s ) ∣ ≤ n − 1 ,即可得到 σ r u n ( n ) ≤ 3 n − 3 σ_{\rm run}(n)\leq 3n-3 σ run ( n ) ≤ 3 n − 3
至此,我们证明了 定理(3.2) The Runs Theorem \text{The Runs Theorem} The Runs Theorem 。
扩展 : ρ r u n , k ( n ) < n / ( k − 1 ) ρ_{\rm run,k}(n)<n/(k-1) ρ run , k ( n ) < n / ( k − 1 ) ,其中 ρ r u n , k ρ_{\rm run,k} ρ run , k 指指数达到 k k k 的 r u n \rm run run 的个数。
若某个 r u n r {\rm run}\ {\bf r} run r 的指数达到 k k k ,则 ∣ L y R ( r ) ∣ ≥ k − 1 |{\rm LyR}({\bf r})|\geq k-1 ∣ LyR ( r ) ∣ ≥ k − 1 ,利用 $\sum\limits_{{\bf r}\in {{\rm Runs}(s)}}|{\rm LyR}({\bf r})|\leq n-1$ 不难证明。
4. Runs 相关计算
在一些不必区分不同字典序的地方,会略去字典序参数 f f f 。
先枚举周期 p p p ,在原串中每隔 p p p 个位置撒一个关键点,一个 r u n \rm run run 必然穿过至少两个关键点。
对相邻的两个关键点向前向后求 L C P \rm LCP LCP ,若覆盖范围能连接,则找到一个可能的 r u n \rm run run 。
可以利用 定理(3.1) 进行剪枝。
当然,目前枚举的周期 p p p 不一定就是当前 r u n \rm run run 的最小周期,所以需要按照 r = ( l , r , p ) {\bf r}=(l,r,p) r = ( l , r , p ) ,中的 ( l , r ) (l,r) ( l , r ) 分类,每个类中保留一个 p p p 最小的即可。
若使用字符串 H a s h \rm Hash Hash 实现,复杂度为 O ( n log 2 n ) O(n\log^2n) O ( n log 2 n ) ,可以使用后缀数组做到 O ( n log n ) O(n\log n) O ( n log n ) 。
O ( n log 2 n ) O(n\log^2n) O ( n log 2 n ) :评测记录 ( 能获得 80 ′ 80' 8 0 ′ ,不剪枝只能得 60 ′ 60' 6 0 ′ )
计算所有的 L y s ( i ) {\rm Ly}_{s}(i) Ly s ( i )
维护每个后缀的 L y \rm Ly Ly 分解 s 1 s 2 … s m s_1s_2\dots s_m s 1 s 2 … s m ,取出 s 1 s_1 s 1 即可得到 L y s ( i ) {\rm Ly}_{s}(i) Ly s ( i ) 。这需要不断向前加字符。
先将字符 c ‾ \overline c c 当作一个 L y \rm Ly Ly 串插入到分解开头,然后若分解中 s 1 < s 2 s_1<s_2 s 1 < s 2 则不断合并。正确性显然。
也就是说,我们只需要支持比较两个串的字典序,这可以随便 H a s h \rm Hash Hash 一手搞定。
更进一步地,根据 定理(1.3) 以及 引理(1.1) ,$s_1<s_2\Leftrightarrow s_1s_2<s_2\Leftrightarrow s_1s_2\dots s_m<s_2\dots s_m$
这就是说,我们把两个相邻 L y \rm Ly Ly 串的比较转化成了后缀的比较。这可以简化代码实现。
找出 R u n s ( s ) {\rm Runs}(s) Runs ( s ) :利用性质
由 定理(3.3) ,一个 r u n \rm run run 所含有的 L y \rm Ly Ly 循环节一定是某个字典序下某个后缀的最长 L y \rm Ly Ly 前缀。显然,两个不同的 r u n \rm run run 不可能包含同一个循环节。
利用此条性质,我们可以不必暴力枚举循环节了,可选的循环节为 O ( n ) O(n) O ( n ) 个,分别前后求 L C P \rm LCP LCP 即可。
形式化地,枚举 l , f l,f l , f ,对于 L y s , f ( l ) = [ l , r ] {\rm Ly}_{s,f}(l)=[l,r] Ly s , f ( l ) = [ l , r ] ,求出最长的 l 1 , l 2 l_1,l_2 l 1 , l 2 使得 $s[l,l+l_1-1]=s[r,r+l_1-1],s[l-l_2,l-1]=s[r-l_2,r-1]$
若 l 1 + l 2 ≥ r − l + 1 l_1+l_2\geq r-l+1 l 1 + l 2 ≥ r − l + 1 ,我们就找到了一个 r u n ( l − l 2 , r + l 1 − 1 , r − l + 1 ) {\rm run}\ (l-l_2,r+l_1-1,r-l+1) run ( l − l 2 , r + l 1 − 1 , r − l + 1 ) 。
如图,两段绿色部分相等,一段紫色是一个 L y \rm Ly Ly 循环节。
l 1 + l 2 ≥ r − l + 1 l_1+l_2\geq r-l+1 l 1 + l 2 ≥ r − l + 1 即要求绿色部分能连接起来,显然这是充要条件。
最终仍然要去重。
实现时,简便的 H a s h \rm Hash Hash 算法是个不错的选择。
O ( n log n ) O(n\log n) O ( n log n ) : 评测记录 (有点卡常数,单模const了才过)
你可能对上述算法有这样的疑问 :L y n d o n \rm Lyndon Lyndon 串和字典序有关,R u n s \rm Runs Runs 只和匹配有关,为什么求 R u n s \rm Runs Runs 的算法对 L y \rm Ly Ly 理论有非常强的依赖性呢?
其实,L y \rm Ly Ly 串只是用于在循环串中确定一个最小循环节(某种意义上构造了映射),以简化求解。
5. Lyndon Tree
⊛ \large\color{blue}\bf\circledast ⊛ 定义 : L y \rm Ly Ly 的标准分解。
定理(1.4) 告诉我们,L y \rm Ly Ly 总是由两个更小的 L y \rm Ly Ly 按字典序拼成的。
由此定义 L y \rm Ly Ly 串 s s s 的标准分解为 s = a b s=ab s = ab ,其中 b b b 恰为 s s s 的最小严格后缀。
由 定理(1.4) 的证明可知,a , b a,b a , b 均为 L y \rm Ly Ly 串,且 a < b a<b a < b 。
⊛ \large\color{blue}\bf\circledast ⊛ 定义 : Lyndon Tree \text{Lyndon Tree} Lyndon Tree
Lyndon Tree \text{Lyndon Tree} Lyndon Tree 是一棵有根二叉树,每个节点代表一个 L y \rm Ly Ly 串。
根节点对应原串 s s s ,要求 s s s 是一个 L y \rm Ly Ly 串。
某个节点 t t t 的两个儿子恰为 t t t 的标准划分 t = a b t=ab t = ab 中的 a , b a,b a , b 。
若不能划分(只剩一个字符)则为叶子。
将 s s s 在 < f <_f < f 下的 Lyndon Tree \text{Lyndon Tree} Lyndon Tree 记为 L y T r e e f ( s ) {\rm LyTree}_f(s) LyTree f ( s ) 。
(阅读上图的正确姿势 : 将子树内的所有字符顺次连接,即得到该节点代表的串)
一个显然的事实是,节点 u = [ l , r ] u=[l,r] u = [ l , r ] 的子树中恰有叶节点 l . . . r l...r l ... r 。
实际上这玩意本质上是 S A \rm SA SA 的 r a n k \rm rank rank 数组的笛卡尔树。构造方法和前文计算 L y s ( i ) {\rm Ly}_{s}(i) Ly s ( i ) 的方法相同。
对于非 L y \rm Ly Ly 串,定义其 LyTree \text{LyTree} LyTree 为其 L y \rm Ly Ly 分解中各个串的 L y T r e e \rm LyTree LyTree 组成的森林。
Δ \color{blue}\bf\Delta Δ 定理(5.1) 记 l c a ( [ l , r ] ) {\rm lca}([l,r]) lca ([ l , r ]) 为叶 节点 l . . . r l...r l ... r 在 L y T r e e \rm LyTree LyTree 上的 l c a \rm lca lca 。
若 s s s 的子串 s [ l , r ] s[l,r] s [ l , r ] 是 L y \rm Ly Ly ,则 u = l c a ( [ l , r ] ) = [ l u , r u ] u={\rm lca}([l,r])=[l_u,r_u] u = lca ([ l , r ]) = [ l u , r u ] ,满足 l = l u ≤ r ≤ r u l=l_u\leq r\leq r_u l = l u ≤ r ≤ r u 。
l = r l=r l = r 时显然成立,考虑 l < r l<r l < r 。
令 v 0 = [ l u , m u ] , v 1 = [ m u + 1 , r u ] v_0=[l_u,m_u],v_1=[m_u+1,r_u] v 0 = [ l u , m u ] , v 1 = [ m u + 1 , r u ] 分别为 u u u 的左右儿子。
由 L C A \rm LCA LCA ,不难发现 l u ≤ l ≤ m u < m u + 1 ≤ r ≤ r u l_u\leq l\leq m_u<m_u+1\leq r\leq r_u l u ≤ l ≤ m u < m u + 1 ≤ r ≤ r u 。
由此,可以将 s [ l u , m u ] , s [ l , r ] , s [ m u + 1 , r u ] s[l_u,m_u],s[l,r],s[m_u+1,r_u] s [ l u , m u ] , s [ l , r ] , s [ m u + 1 , r u ] 分别写成 c a , a b , b d ca,ab,bd c a , ab , b d 的形式。(a , b a,b a , b 非空,c , d c,d c , d 可空)
且 ( c a , b d ) (ca,bd) ( c a , b d ) 是 s [ l u , r u ] = c a b d s[l_u,r_u]=cabd s [ l u , r u ] = c ab d 的标准分解。
由 s [ l , r ] = a b s[l,r]=ab s [ l , r ] = ab 是 L y \rm Ly Ly ,可得 a b < b ⇒ a b d < b d ab<b\Rightarrow abd<bd ab < b ⇒ ab d < b d 。
若 c c c 非空,则最小严格后缀可以是 a b d abd ab d 而不可能是 b d bd b d ,与标准分解的定义矛盾。因此 c c c 必为空串,即 l u = l l_u=l l u = l 。
Δ \color{blue}\bf\Delta Δ 定理(5.2) 从任一个 l l l 开始的最长 L y \rm Ly Ly 子串 s [ l , r ] s[l,r] s [ l , r ] 必然在 s s s 的 L y T r e e \rm LyTree LyTree 中。
利用 定理(5.1) ,求 u = l c a ( [ l , r ] ) = [ l , r ′ ] ( r ′ ≥ r ) u={\rm lca}([l,r])=[l,r']\ (r'\geq r) u = lca ([ l , r ]) = [ l , r ′ ] ( r ′ ≥ r ) 。
又因为 s [ l , r ] s[l,r] s [ l , r ] 是最长的,所以只能是 r ′ = r r'=r r ′ = r ,故树中的 u u u 即为 s [ l , r ] s[l,r] s [ l , r ] 。
Δ \color{blue}\bf\Delta Δ 定理(5.3) s [ l , r ] s[l,r] s [ l , r ] 是 l ( l > 1 ) l\ (l>1) l ( l > 1 ) 开始的最长 L y \rm Ly Ly 串 ⇔ \Leftrightarrow ⇔ 节点 u = l c a ( [ l , r ] ) u={\rm lca}([l,r]) u = lca ([ l , r ]) 是一个右儿子。
充分性 : 对于任意的 r ′ > r r'>r r ′ > r , s [ l , r ′ ] s[l,r'] s [ l , r ′ ] 都不是 L y \rm Ly Ly ,显然 s [ l , r ] s[l,r] s [ l , r ] 不可能是另一个 L y \rm Ly Ly 的标准分解的左半部分。
再根据 定理(5.2) ,其一定在树上,则只能是右儿子。
必要性 : 若 s [ l , r ] s[l,r] s [ l , r ] 不是 l l l 开始的最长 L y \rm Ly Ly ,则存在 L y s [ l , r ′ ] {\rm Ly}\ s[l,r'] Ly s [ l , r ′ ] 满足 r ′ > r r'>r r ′ > r 。
根据 定理(5.1) 可得存在 r ′ ′ ≥ r ′ > r r''\geq r'>r r ′′ ≥ r ′ > r 满足 l c a ( [ l , r ′ ] ) = s [ l , r ′ ′ ] {\rm lca}([l,r'])=s[l,r''] lca ([ l , r ′ ]) = s [ l , r ′′ ] ,且显然为 s [ l , r ] s[l,r] s [ l , r ] 的祖先。
所以,s [ l , r ] s[l,r] s [ l , r ] 显然不可能为右儿子。(只能从 s [ l , r ′ ′ ] s[l,r''] s [ l , r ′′ ] 一串左链下来)
推论 : 结合 定理(3.4) ,对于任意一个 r u n r {\rm run}\ {\bf r} run r ,若其正序为 f f f ,其所有 L y R o o t \rm LyRoot LyRoot 都在 L y T r e e f ( s ) {\rm LyTree}_f(s) LyTree f ( s ) 的右儿子中出现。
引理(5.1) Weak Periodicity Lemma \text{Weak Periodicity Lemma} Weak Periodicity Lemma : 若 p , q p,q p , q 为 s s s 的周期,且 p + q ≤ ∣ s ∣ p+q\leq |s| p + q ≤ ∣ s ∣ ,则 gcd ( p , q ) \gcd(p,q) g cd( p , q ) 也是 s s s 的周期。
证明见 Border理论小记 。该引理简称为 W P L \rm WPL WPL 。
记 e x r u n ( l , r ) {\rm exrun}(l,r) exrun ( l , r ) 为满足 l ′ ≤ l , r ≤ r ′ , p ≤ ( r − l + 1 ) / 2 l'\leq l,r\leq r',p\leq (r-l+1)/2 l ′ ≤ l , r ≤ r ′ , p ≤ ( r − l + 1 ) /2 的一个 r u n r = ( l ′ , r ′ , p ) {\rm run}\ {\bf r}=(l',r',p) run r = ( l ′ , r ′ , p ) 。
也就是说,能覆盖 [ l , r ] [l,r] [ l , r ] ,且循环节长度小于区间一半的 r u n \rm run run 。
根据 W P L \rm WPL WPL ,若 e x r u n ( l , r ) {\rm exrun}(l,r) exrun ( l , r ) 存在则必然唯一,否则可以在 [ l , r ] [l,r] [ l , r ] 中构造更小的循环节。
这可以视作 定理(3.1) 的扩展 : 两个 ${\rm run}\ {\bf r_1}=(l_1,r_1,p_1),\ {\bf r_2}=(l_2,r_2,p_2)\ (p_1≠p_2)$ ,的交 < p 1 + p 2 <p_1+p_2 < p 1 + p 2 ,否则可以在相交的部分构造出更小的循环节 gcd ( p 1 , p 2 ) \gcd(p_1,p_2) g cd( p 1 , p 2 ) 。
不难发现,子串半周期查询问题等价于求 e x r u n ( l , r ) {\rm exrun}(l,r) exrun ( l , r ) 。
算法为 : 构造 L y T r e e 0 ( s ) , L y T r e e 1 ( s ) {\rm LyTree}_0(s),{\rm LyTree}_1(s) LyTree 0 ( s ) , LyTree 1 ( s ) ,分别找到 $a_0={\rm lca}_0\Big(\big[l,\lceil (l+r)/2\rceil\big]\Big),a_1={\rm lca}_1\Big(\big[l,\lceil (l+r)/2\rceil\big]\Big)$ ,检查其右儿子作为 L y R o o t \rm LyRoot LyRoot 对应的 r u n \rm run run 是否满足条件。
正确性证明 :
假设有 r = e x r u n ( l , r ) = ( l ′ , r ′ , p ) {\bf r}={\rm exrun}(l,r)=(l',r',p) r = exrun ( l , r ) = ( l ′ , r ′ , p ) ,由于 p ≤ ( r − l + 1 ) / 2 p\leq (r-l+1)/2 p ≤ ( r − l + 1 ) /2 一定存在一个 L y R o o t λ = [ i λ , j λ ] {\rm LyRoot}\ λ =[i_λ ,j_λ] LyRoot λ = [ i λ , j λ ] 包含 ⌈ ( l + r ) / 2 ⌉ \lceil (l+r)/2\rceil ⌈( l + r ) /2 ⌉ 这个位置。
设 r {\bf }r r 的正序为 f f f ,根据 定理(5.3) ,λ λ λ 在 L y T r e e f ( s ) {\rm LyTree}_f(s) LyTree f ( s ) 中作为右儿子出现。
由 $a_f={\rm lca}_f\Big(\big[l,\lceil (l+r)/2\rceil\big]\Big)$ ,可得 a f a_f a f 同样包含 ⌈ ( l + r ) / 2 ⌉ \lceil (l+r)/2\rceil ⌈( l + r ) /2 ⌉ 这个位置。且 a f a_f a f 的长度 ≥ [ l , ⌈ ( l + r ) / 2 ⌉ ] \geq\big[l,\lceil (l+r)/2\rceil\big] ≥ [ l , ⌈( l + r ) /2 ⌉ ] 的长度 > p >p > p 。
综上不难推出 a f a_f a f 是 λ λ λ 的祖先。
若其右儿子 b = [ l b , r b ] ≠ λ b=[l_b,r_b]≠λ b = [ l b , r b ] = λ ,根据 L C A \rm LCA LCA 的定义, b b b 一定包含 ⌈ ( l + r ) / 2 ⌉ \lceil (l+r)/2\rceil ⌈( l + r ) /2 ⌉ 且不包含 i i i ,则 b b b 也是 λ λ λ 的祖先。
由于 λ λ λ 都是右儿子,可得 i < l b < i λ i<l_b<i_λ i < l b < i λ 。
若 r b ≤ r ′ r_b\leq r' r b ≤ r ′ ,则 s [ l b , r b ] s[l_b,r_b] s [ l b , r b ] 有周期 p p p ,与 L y \rm Ly Ly 矛盾。
若 r b > r ′ r_b>r' r b > r ′ ,由正序的定义有 s [ r + 1 ] < f s [ r + 1 − p ] s[r+1]<_fs[r+1-p] s [ r + 1 ] < f s [ r + 1 − p ] ,则可以发现 s [ l λ , r b ] < f s [ l b , r b ] s[l_λ,r_b]<_fs[l_b,r_b] s [ l λ , r b ] < f s [ l b , r b ] ,同样与 L y \rm Ly Ly 矛盾。
综上,λ λ λ 必为 a f a_f a f 的右儿子。
6. 本原平方串(primitive square)
⊛ \large\color{blue}\bf\circledast ⊛ 定义 : 若一个串 s s s 的最小周期恰为 ∣ s ∣ / 2 |s|/2 ∣ s ∣/2 ,则称之为本原平方串,即 primitive square \text{primitive square} primitive square 。
例 : abcabc \texttt{abcabc} abcabc 是本原平方串,而 abac,abababab \texttt{abac,abababab} abac,abababab 则不是。
引理(6.1) : 若 a a a 为 b b b 的前缀,且 a a a 有 p p p 的循环节,b b b 有 q q q 的循环节,p ∣ q , q ≤ ∣ a ∣ p|q,\ q\leq |a| p ∣ q , q ≤ ∣ a ∣ ,则 b b b 也有 p p p 的循环节。
显然。
引理(6.2) 若非空串 s , t s,t s , t 满足 s s ss ss 是 t t tt tt 的前缀,且 2 ∣ s ∣ > t 2|s|>t 2∣ s ∣ > t ,则 ∣ t ∣ − ∣ s ∣ |t|-|s| ∣ t ∣ − ∣ s ∣ 是 s s s 的周期。
画画图不难理解,这里略去严格证明。
Δ \color{blue}\bf\Delta Δ 定理(6.1) : 若非空串 u , v , w u,v,w u , v , w 满足 u u uu uu 是 v v vv v v 的前缀,v v vv v v 是 w w ww w w 的前缀,且 u u uu uu 是本原平方串,则有 ∣ u ∣ + ∣ v ∣ ≤ ∣ w ∣ |u|+|v|\leq |w| ∣ u ∣ + ∣ v ∣ ≤ ∣ w ∣
证明比较长,建议大家记下导出的不等式和每个串已经导出的周期,而且不要把不同情况的讨论弄混了。
若 ∣ w ∣ ≥ 2 ∣ v ∣ ≥ ∣ v ∣ + ∣ u ∣ |w|\geq 2|v|\geq |v|+|u| ∣ w ∣ ≥ 2∣ v ∣ ≥ ∣ v ∣ + ∣ u ∣ 则自然成立,所以只考虑 ∣ w ∣ < 2 ∣ v ∣ |w|<2|v| ∣ w ∣ < 2∣ v ∣ 的情况。
由 引理(6.2) 可得,∣ w ∣ − ∣ v ∣ |w|-|v| ∣ w ∣ − ∣ v ∣ 是 v v v 的周期。
假设 ∣ u ∣ + ∣ v ∣ > ∣ w ∣ ⇒ ∣ w ∣ − ∣ v ∣ < ∣ u ∣ |u|+|v|>|w|\Rightarrow |w|-|v|<|u| ∣ u ∣ + ∣ v ∣ > ∣ w ∣ ⇒ ∣ w ∣ − ∣ v ∣ < ∣ u ∣ ,所以 ∣ w ∣ − ∣ v ∣ |w|-|v| ∣ w ∣ − ∣ v ∣ 也是前缀 u u u 的周期。
若 2 ∣ u ∣ ≤ ∣ v ∣ 2|u|\leq |v| 2∣ u ∣ ≤ ∣ v ∣ ,则 u u uu uu 是 v v v 的前缀,可推知 ∣ w ∣ − ∣ v ∣ |w|-|v| ∣ w ∣ − ∣ v ∣ 也是 u u uu uu 的周期。此时,则有周期 ∣ w ∣ − ∣ v ∣ < ∣ u ∣ = ∣ u u ∣ / 2 |w|-|v|<|u|=|uu|/2 ∣ w ∣ − ∣ v ∣ < ∣ u ∣ = ∣ uu ∣/2 ,和本原平方串的定义矛盾。
若 2 ∣ u ∣ > ∣ v ∣ 2|u|>|v| 2∣ u ∣ > ∣ v ∣ ,此时由 引理(6.2) 可得 ∣ v ∣ − ∣ u ∣ |v|-|u| ∣ v ∣ − ∣ u ∣ 是 u u u 的周期。
此外, ∣ u ∣ , ∣ w ∣ − ∣ v ∣ |u|,|w|-|v| ∣ u ∣ , ∣ w ∣ − ∣ v ∣ 是 v v v 的不同 周期。但是,由于 v v v 是本原平方串(长度超过一半的)的前缀,所以其是弱周期串(没有不超过长度一半的周期)。
若对一个串使用 W P L \rm WPL WPL ,得到的循环节必然不超过长度一半(得到强周期串),所以可以否定其前提条件,即有 ∣ u ∣ + ∣ w ∣ − ∣ v ∣ ≰ ∣ v ∣ ⇒ ∣ u ∣ + ∣ w ∣ > 2 ∣ v ∣ |u|+|w|-|v|\not\leq |v|\Rightarrow |u|+|w|> 2|v| ∣ u ∣ + ∣ w ∣ − ∣ v ∣ ≤ ∣ v ∣ ⇒ ∣ u ∣ + ∣ w ∣ > 2∣ v ∣ 。
令 v s 1 = w , u = s 1 s 2 , v = u s 3 = s 1 s 2 s 3 vs_1=w,u=s_1s_2,v=us_3=s_1s_2s_3 v s 1 = w , u = s 1 s 2 , v = u s 3 = s 1 s 2 s 3 ,则有 w = s 1 s 2 s 3 s 1 w=s_1s_2s_3s_1 w = s 1 s 2 s 3 s 1 。
$|u|+|w|> 2|v|\Rightarrow |s_1s_2|+|s_1s_2s_3s_1|> 2|s_1s_2s_3|\Rightarrow |s_1|>|s_3|$
$|u|+|v|>|w|\Rightarrow |s_1s_2|+|s_1s_2s_3|> |s_1s_2s_3s_1|\Rightarrow |s_2|>0$ (保证代换有意义)
将 u u , v v , w w uu,vv,ww uu , v v , w w 并排写出 :
$$\begin{aligned}
&\boxed{\phantom{|||||||||}s_1\phantom{|||||||||}} \boxed{\phantom{|||}s_2\phantom{|||}} {\color{red}\boxed{\phantom{|||||||||}s_1\phantom{|||||||||}}} \boxed{\phantom{|||}s_2\phantom{|||}}\\
&\boxed{\phantom{|||||||||}s_1\phantom{|||||||||}} {\color{red}\boxed{\phantom{|||}s_2\phantom{|||}} \boxed{\phantom{||||||}s_3\phantom{||||||}}} \boxed{\phantom{|||||||||}s_1\phantom{|||||||||}} {\color{red}\boxed{\phantom{|||}s_2\phantom{|||}} \boxed{\phantom{||||||}s_3\phantom{||||||}}}\\
&\boxed{\phantom{|||||||||}s_1\phantom{|||||||||}} \boxed{\phantom{|||}s_2\phantom{|||}} \boxed{\phantom{||||||}s_3\phantom{||||||}} \boxed{\phantom{|||||||||}s_1\phantom{|||||||||}} {\color{red}\boxed{\phantom{|||||||||}s_1\phantom{|||||||||}}} \boxed{\phantom{|||}s_2\phantom{|||}} \boxed{\phantom{||||||}s_3\phantom{||||||}} \boxed{\phantom{|||||||||}s_1\phantom{|||||||||}}
\end{aligned}$$
由红色部分可以得出,∣ s 2 ∣ |s_2| ∣ s 2 ∣ 是 s 2 s 3 s_2s_3 s 2 s 3 的周期。此外,s 2 s 3 s_2s_3 s 2 s 3 是 u = s 1 s 2 u=s_1s_2 u = s 1 s 2 的前缀,所以也有周期 ∣ v ∣ − ∣ u ∣ = ∣ s 3 ∣ |v|-|u|=|s_3| ∣ v ∣ − ∣ u ∣ = ∣ s 3 ∣ 。
使用 W P L \rm WPL WPL 可得 s 2 s 3 s_2s_3 s 2 s 3 有周期 r = gcd ( ∣ s 2 ∣ , ∣ s 3 ∣ ) r=\gcd(|s_2|,|s_3|) r = g cd( ∣ s 2 ∣ , ∣ s 3 ∣ ) 。由 引理(6.1) 得 u u u 也有周期 r r r 。
接下来考虑 u = s 1 s 2 u=s_1s_2 u = s 1 s 2 ,其周期有 ∣ w ∣ − ∣ v ∣ = ∣ s 1 ∣ |w|-|v|=|s_1| ∣ w ∣ − ∣ v ∣ = ∣ s 1 ∣ 和 r r r ,而 r ≤ ∣ s 2 ∣ r\leq |s_2| r ≤ ∣ s 2 ∣ ,所以继续使用 W P L \rm WPL WPL 可得周期 r ′ = gcd ( r , ∣ s 1 ∣ ) = gcd ( ∣ s 1 ∣ , ∣ s 2 ∣ , ∣ s 3 ∣ ) r'=\gcd(r,|s_1|)=\gcd(|s_1|,|s_2|,|s_3|) r ′ = g cd( r , ∣ s 1 ∣ ) = g cd( ∣ s 1 ∣ , ∣ s 2 ∣ , ∣ s 3 ∣ ) 。
这表明 u u u 有非平凡整周期,和本原平方串的定义矛盾。证毕。
推论① : 串 s s s 中(位置不同的)本原平方串的个数不超过 O ( ∣ s ∣ log ∣ s ∣ ) O(|s|\log |s|) O ( ∣ s ∣ log ∣ s ∣ ) 。
考虑每个开头位置,若有两个本原平方串 u u , v v uu,vv uu , v v ,则下一个的长度至少为前两个的和(最劣为斐波那契),如此重复不超过 O ( log n ) O(\log n) O ( log n ) 轮。
推论② : 串 s s s 中(本质不同的)本原平方串的个数不超过 O ( ∣ s ∣ ) O(|s|) O ( ∣ s ∣ ) 。
考虑每个开头位置,若有三个本原平方串 u u , v v , w w ( ∣ u ∣ < ∣ v ∣ < ∣ w ∣ ) uu,vv,ww (|u|<|v|<|w|) uu , v v , w w ( ∣ u ∣ < ∣ v ∣ < ∣ w ∣ ) ,则有 ∣ w ∣ ≥ ∣ u ∣ + ∣ v ∣ > 2 ∣ u ∣ |w|\geq |u|+|v|>2|u| ∣ w ∣ ≥ ∣ u ∣ + ∣ v ∣ > 2∣ u ∣ ,所以 u u uu uu 在每个 w w w 中都出现了一次,并不是在此处第一次出现,暂不统计。
这样,每个开头位置出现的本质不同的本原平方串就至多两个。
听说本质不同的平方串也是 O ( ∣ s ∣ ) O(|s|) O ( ∣ s ∣ ) 的。
Δ \color{blue}\bf\Delta Δ 定理(6.2) : 每个本原平方串一定属于恰好一个和它周期对应的 r u n \rm run run 的一部分。
某个本原平方串 u u uu uu 本身就足以成为一个周期为 ∣ u ∣ |u| ∣ u ∣ 的 r u n \rm run run ,还可能可以向两边扩展,所以这样的 r u n \rm run run 一定存在。
由 定理(3.1) ,不会有两个周期对应的 r u n \rm run run 包含同一个本原平方串。
由 定理(6.2) ,只需要对每个 r u n \rm run run 找出其中所有本原平方串即可。
由最小循环节的性质,在 r u n r = ( l , r , p ) {\rm run}\ {\bf r}=(l,r,p) run r = ( l , r , p ) 中, [ l , r ] [l,r] [ l , r ] 中任意连续长为 2 p 2p 2 p 的子串都是本原平方串。
寻找的复杂度也可以写成 $\sum\limits_{{\bf r}=(l,r,p)\in{\rm Runs(s)}}r-l+2-2p$ ,可得该式为 O ( n log n ) O(n\log n) O ( n log n ) 量级。