周期和border
0<q≤∣s∣,s[i]=s[i+p],∀i∈1...∣s∣−p0 < 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, ppp就是sss的周期。
0≤r≤∣s∣,pre(s,r)=suf(s,r),pre(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)就是sss的borderborderborder。
KMP算法
可以在O(n)O(n)O(n)时间求出数组fail[1,n]fail[1, n]fail[1,n],其中fail[i]fail[i]fail[i] 代表前缀s[1...i]s[1...i]s[1...i]的最大borderborderborder长度。
sss的所有borderborderborder长度?
fail[n],fail[fail[n]]....{fail[n], fail[fail[n]] .... }fail[n],fail[fail[n]]....
后缀数组和LCP查询
在预处理之后,可以O(1)O(1)O(1)的求解LCP,LCS。LCP, LCS。LCP,LCS。
对于拥有周期为ppp的串sss,LCP(s[1...n],s[1+p...n])=n−pLCP(s[1...n], s[1+p...n]) = n - pLCP(s[1...n],s[1+p...n])=n−p。
借助上述定理,就可以通过求解LCP(i,i+p)LCP(i, i + p)LCP(i,i+p)查询最大的lll使得s[i...i+l−1]s[i...i+l-1]s[i...i+l−1]拥有周期ppp了。
Weak Periodicity Lemma
ppp和qqq是字符串sss的周期,p+q≤∣s∣,p+q \le |s|,p+q≤∣s∣,则gcd(p,q)gcd(p,q)gcd(p,q)也是sss的周期。
Periodicity Lemma
ppp和qqq是字符串sss的周期,p+q−gcd(p,q)≤∣s∣,p+q - gcd(p, q) \le |s|,p+q−gcd(p,q)≤∣s∣,则gcd(p,q)gcd(p,q)gcd(p,q)也是sss的周期。
abaabaabaabaabaaba
字符串匹配
引理:字符串u,vu, vu,v满足2∣u∣≥∣v∣,2|u| \geq |v|,2∣u∣≥∣v∣,则uuu在vvv中的所有匹配位置组成一个等差数列。若这个数列至少含有333项,则其公差ddd等于uuu的最小周期per(u),可以结合PeriodicityLemma用反证法证明设(p≤d)per(u),可以 结合Periodicity Lemma用反证法证明设(p \le d)per(u),可以结合PeriodicityLemma用反证法证明设(p≤d)。
此时per(u)≤∣u∣/2per(u) \le |u|/2per(u)≤∣u∣/2。
Border的结构
引理1:字符串sss的所有不小于∣s∣/2|s|/2∣s∣/2的borderborderborder的长度组成一个等差数列。
证明:设sss最大的borderborderborder的长度为n−p(p≤∣s∣/2)n - p (p \le |s|/2)n−p(p≤∣s∣/2), 另外某个borderborderborder的长度为n−q(q≤∣s∣/2),n-q(q \le |s|/2),n−q(q≤∣s∣/2),则ppp和qqq都是sss的周期,ppp为最小周期,那么gcd(p,q)gcd(p, q)gcd(p,q)也是sss的周期,可知ppp可能为000,因此gcd(p,q)≥p=>p∣qgcd(p, q) \geq p => p | qgcd(p,q)≥p=>p∣q。
将s[1...n]s[1...n]s[1...n]的所有borderborderborder按长度xxx分类:
x∈[1,2),[2,4)...[2k−1,2k),[2k,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)。
分开考虑每段区间
- x∈[2k,n),2k≥n/2x\in[2^k, n), 2^k \geq n/2x∈[2k,n),2k≥n/2,里面的borderborderborder长度已证为等差数列。
- x∈[2i−1,2i)x\in[2^{i-1}, 2^i)x∈[2i−1,2i), 考虑串uuu和vvv:
当∣u∣=∣v∣|u| = |v|∣u∣=∣v∣
记PS(u,v)=k:pre(u,k)=suf(v,k)PS(u, v) = {k : pre(u, k) = suf(v, k)}PS(u,v)=k:pre(u,k)=suf(v,k)
记LargePS(u,v)=k∈PS(u,v),k≥∣u∣/2LargePS(u,v) = {k\in PS(u,v), k \geq |u| / 2}LargePS(u,v)=k∈PS(u,v),k≥∣u∣/2
则[2i−1,2i)[2^{i-1}, 2^i)[2i−1,2i)内的borderborderborder长度集合为LargePS(pre(s,2i),suf(s,2i))LargePS(pre(s, 2^i), suf(s, 2^i))LargePS(pre(s,2i),suf(s,2i))
引理:
LargePS(u,v)LargePS(u, v)LargePS(u,v)组成一个等差数列。