从lyndon分解到runs
参考文献
抄抄会的证明o(><;)oo
一堆定义
字符串从 0 0 0开始, n − 1 n-1 n−1结束.
s [ l : r ] s[l:r] s[l:r]表示 s s s的一个字串,从 l l l开始, r r r结束.
若 a a a的字典序小于 b b b,则称 a < b a<b a<b.
若 a a a< b b b且 a a a不是 b b b的前缀,则称 a ◃ b a\triangleleft b a◃b.
a b c abc abc表示拼接 a , b , c a,b,c a,b,c三个字符串, a n a^n an表示 n n n个字符串 a a a相接.
lyndon分解
lyndon串
a a a是lyndon串当且仅当 ∀ a \forall a ∀a的后缀 b b b,都有 a ◃ b a\triangleleft b a◃b.或者说,lyndon串是其 n n n个循环移位串中最小的一个.
设 L \mathcal{L} L表示所有lyndon串的集合.
CFL
C F L ( s ) CFL(s) CFL(s)是一个关于 s s s的划分,即划分成 w 1 w 2 . . . w k = s w_1w_2...w_k=s w1w2...wk=s,使得所有 w w w都是lyndon串,且 w 1 ≥ w 2 ≥ . . . ≥ w k w_1\geq w_2\geq ...\geq w_k w1≥w2≥...≥wk.
lyndon concatanation
若 a < b ∈ L a<b\in \mathcal{L} a<b∈L,则 a b ∈ L ab\in \mathcal{L} ab∈L
构造CFL
单个字母一定是lyndon串,那么把 s s s中所有单增的序列都缩起来,剩下的就是合法的CFL.
existence and uniqueness of CFL
根据构造, C F L ( s ) CFL(s) CFL(s)存在且唯一.
Duval算法
Duval可以在 O ( n ) O(n) O(n)的时间内求出一个串的CFL.
详见oi-wiki
lyndon array
L i = max { j ∣ s [ i : j − 1 ] ∈ L } L_i=\max\{j|s[i:j-1]\in \mathcal{L}\} Li=max{j∣s[i:j−1]∈L}.
在 < i <_i <i意义下定义的 L L L记为 L i L_i Li.
最长的lyndon子串是不交的
∀ i < j < L i , L j ≤ L i \forall i<j<L_i,L_j\leq L_i ∀i<j<Li,Lj≤Li
suffix
设 s u f ( i ) = s [ i : n − 1 ] suf(i)=s[i:n-1] suf(i)=s[i:n−1],即以 i i i开始的后缀.
s [ i : L i − 1 ] ◃ s [ j : L i − 1 ] s[i:L_i-1]\triangleleft s[j:L_i-1] s[i:Li−1]◃s[j:Li−1],所以 s u f ( i ) ◃ s u f ( j ) suf(i)\triangleleft suf(j) suf(i)◃suf(j). ( i < j < L i ) (i<j<L_i) (i<j<Li)
设 N S V ( i ) = min [ 1 , n ] ∖ { j ∈ ( i , n ) ∣ s u f ( i ) ◃ s u d ( j ) } NSV(i)=\min[1,n]\setminus\{j\in(i,n)|suf(i)\triangleleft sud(j)\} NSV(i)=min[1,n]∖{j∈(i,n)∣suf(i)◃sud(j)},即第一个不满足 s u f ( i ) ◃ s u f ( j ) suf(i)\triangleleft suf(j) suf(i)◃suf(j)的 j j j.
显然有 L i ≤ N S V ( i ) L_i\leq NSV(i) Li≤NSV(i).神奇的是 s [ i : N S V ( i ) − 1 ] ∈ L s[i:NSV(i)-1]\in \mathcal{L} s[i:NSV(i)−1]∈L,所以 L i = N S V ( i ) L_i=NSV(i) Li=NSV(i).
runs
run指 s s s中一个两边都不能拓展的循环字串,且其周期至少完整出现过两次.
形式化的说,run是一个三元组 ( l , r , p ) (l,r,p) (l,r,p),满足 p p p是 s [ l : r ] s[l:r] s[l:r]的最小周期,且 r − l + 1 ≥ p × 2 r-l+1\geq p\times 2 r−l+1≥p×2,同时满足 s l − 1 ≠ s i − 1 + p , s r + 1 ≠ s r + 1 − p s_{l-1}\not =s_{i-1+p},s_{r+1}\not=s_{r+1-p} sl−1=si−1+p,sr+1=sr+1−p.
lyndon root
一个run ( l , r , p ) (l,r,p) (l,r,p) 的lyndon root是 s [ l : r ] s[l:r] s[l:r]的一个长为 p p p的lyndon子串.
每个run都有lyndon root.这是平凡的,参考环破成链可以发现run中包含了一个串的 n n n个循环同构串.
linear runs
我们设 < 0 <^0 <0表示 < < <, < 1 <^1 <1表示 > > >.
那么对于每个run,存在 i , t i,t i,t满足 s [ i : L i − 1 ] s[i:L_i-1] s[i:Li−1]是其lyndon root.
所以run的总数 ≤ n × 2 \leq n\times 2 ≤n×2.
如何计算 L 0 L_0 L0
对于 s s s的每个后缀维护其CFL即可.从后往前插入每个字符,判断是否能合并.
如何计算runs
已经求出所有lyndon root(也是循环节),求lcs和lcp即可.