0 < q ≤ ∣ s ∣ , s [ i ] = s [ i + p ] , ∀ i ∈ 1... ∣ s ∣ − p 0 < q \le |s|, s[i] = s[i+p], \forall i \in {1...|s|- p} 0<q≤∣s∣,s[i]=s[i+p],∀i∈1...∣s∣−p, p p p就是 s s s的周期。
0 ≤ r ≤ ∣ s ∣ , p r e ( s , r ) = s u f ( s , r ) , p r e ( s , r ) 0 \le r \le |s|, pre(s, r) = suf(s, r), pre(s, r) 0≤r≤∣s∣,pre(s,r)=suf(s,r),pre(s,r)就是 s s s的 b o r d e r border border。
可以在 O ( n ) O(n) O(n)时间求出数组 f a i l [ 1 , n ] fail[1, n] fail[1,n],其中 f a i l [ i ] fail[i] fail[i] 代表前缀 s [ 1... i ] s[1...i] s[1...i]的最大 b o r d e r border border长度。
s s s的所有 b o r d e r border border长度?
f a i l [ n ] , f a i l [ f a i l [ n ] ] . . . . {fail[n], fail[fail[n]] .... } fail[n],fail[fail[n]]....
在预处理之后,可以 O ( 1 ) O(1) O(1)的求解 L C P , L C S 。 LCP, LCS。 LCP,LCS。
对于拥有周期为 p p p的串 s s s, L C P ( s [ 1... n ] , s [ 1 + p . . . n ] ) = n − p LCP(s[1...n], s[1+p...n]) = n - p LCP(s[1...n],s[1+p...n])=n−p。
借助上述定理,就可以通过求解 L C P ( i , i + p ) LCP(i, i + p) LCP(i,i+p)查询最大的 l l l使得 s [ i . . . i + l − 1 ] s[i...i+l-1] s[i...i+l−1]拥有周期 p p p了。
p p p和 q q q是字符串 s s s的周期, p + q ≤ ∣ s ∣ , p+q \le |s|, p+q≤∣s∣,则 g c d ( p , q ) gcd(p,q) gcd(p,q)也是 s s s的周期。
p p p和 q q q是字符串 s s s的周期, p + q − g c d ( p , q ) ≤ ∣ s ∣ , p+q - gcd(p, q) \le |s|, p+q−gcd(p,q)≤∣s∣,则 g c d ( p , q ) gcd(p,q) gcd(p,q)也是 s s s的周期。
a b a a b a abaaba abaaba
引理:字符串 u , v u, v u,v满足 2 ∣ u ∣ ≥ ∣ v ∣ , 2|u| \geq |v|, 2∣u∣≥∣v∣,则 u u u在 v v v中的所有匹配位置组成一个等差数列。若这个数列至少含有 3 3 3项,则其公差 d d d等于 u u u的最小周期 p e r ( u ) , 可 以 结 合 P e r i o d i c i t y L e m m a 用 反 证 法 证 明 设 ( p ≤ d ) per(u),可以 结合Periodicity Lemma用反证法证明设(p \le d) per(u),可以结合PeriodicityLemma用反证法证明设(p≤d)。
此时 p e r ( u ) ≤ ∣ u ∣ / 2 per(u) \le |u|/2 per(u)≤∣u∣/2。
引理1:字符串 s s s的所有不小于 ∣ s ∣ / 2 |s|/2 ∣s∣/2的 b o r d e r border border的长度组成一个等差数列。
证明:设 s s s最大的 b o r d e r border border的长度为 n − p ( p ≤ ∣ s ∣ / 2 ) n - p (p \le |s|/2) n−p(p≤∣s∣/2), 另外某个 b o r d e r border border的长度为 n − q ( q ≤ ∣ s ∣ / 2 ) , n-q(q \le |s|/2), n−q(q≤∣s∣/2),则 p p p和 q q q都是 s s s的周期, p p p为最小周期,那么 g c d ( p , q ) gcd(p, q) gcd(p,q)也是 s s s的周期,可知 p p p可能为 0 0 0,因此 g c d ( p , q ) ≥ p = > p ∣ q gcd(p, q) \geq p => p | q gcd(p,q)≥p=>p∣q。
将 s [ 1... n ] s[1...n] s[1...n]的所有 b o r d e r border border按长度 x x x分类:
x ∈ [ 1 , 2 ) , [ 2 , 4 ) . . . [ 2 k − 1 , 2 k ) , [ 2 k , n ) x\in[1, 2), [2, 4) ... [2^{k-1}, 2^{k}), [2^k, n) x∈[1,2),[2,4)...[2k−1,2k),[2k,n)。
分开考虑每段区间