字符串学习:字符串算法选讲-金策

周期和border

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<qs,s[i]=s[i+p],i1...sp, 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) 0rs,pre(s,r)=suf(s,r),pre(s,r)就是 s s s b o r d e r border border

KMP算法

可以在 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]]....

后缀数组和LCP查询

在预处理之后,可以 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])=np
借助上述定理,就可以通过求解 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+l1]拥有周期 p p p了。

Weak Periodicity Lemma

p p p q q q是字符串 s s s的周期, p + q ≤ ∣ s ∣ , p+q \le |s|, p+qs, g c d ( p , q ) gcd(p,q) gcd(p,q)也是 s s s的周期。

Periodicity Lemma

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+qgcd(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|, 2uv 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(pd)
此时 p e r ( u ) ≤ ∣ u ∣ / 2 per(u) \le |u|/2 per(u)u/2

Border的结构

引理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) np(ps/2), 另外某个 b o r d e r border border的长度为 n − q ( q ≤ ∣ s ∣ / 2 ) , n-q(q \le |s|/2), nq(qs/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=>pq

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)...[2k1,2k),[2k,n)
分开考虑每段区间

  • x ∈ [ 2 k , n ) , 2 k ≥ n / 2 x\in[2^k, n), 2^k \geq n/2 x[2k,n),2kn/2,里面的 b o r d e r border border长度已证为等差数列。
  • x ∈ [ 2 i − 1 , 2 i ) x\in[2^{i-1}, 2^i) x[2i1,2i), 考虑串 u u u v v v:
    ∣ u ∣ = ∣ v ∣ |u| = |v| u=v
    P S ( u , v ) = k : p r e ( u , k ) = s u f ( v , k ) PS(u, v) = {k : pre(u, k) = suf(v, k)} PS(u,v)=k:pre(u,k)=suf(v,k)
    L a r g e P S ( u , v ) = k ∈ P S ( u , v ) , k ≥ ∣ u ∣ / 2 LargePS(u,v) = {k\in PS(u,v), k \geq |u| / 2} LargePS(u,v)=kPS(u,v),ku/2
    [ 2 i − 1 , 2 i ) [2^{i-1}, 2^i) [2i1,2i)内的 b o r d e r border border长度集合为 L a r g e P S ( p r e ( s , 2 i ) , s u f ( s , 2 i ) ) LargePS(pre(s, 2^i), suf(s, 2^i)) LargePS(pre(s,2i),suf(s,2i))
    引理:
    L a r g e P S ( u , v ) LargePS(u, v) LargePS(u,v)组成一个等差数列。

推论:字符串border排序后可以分成O(log|s|)段,每段是一个等差数列。

你可能感兴趣的:(数据结构,CAMP,线段树)