周期和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<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。
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])=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了。
Weak Periodicity Lemma
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的周期。
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+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。
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)
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)。
分开考虑每段区间
- x ∈ [ 2 k , n ) , 2 k ≥ n / 2 x\in[2^k, n), 2^k \geq n/2 x∈[2k,n),2k≥n/2,里面的 b o r d e r border border长度已证为等差数列。
-
x
∈
[
2
i
−
1
,
2
i
)
x\in[2^{i-1}, 2^i)
x∈[2i−1,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)=k∈PS(u,v),k≥∣u∣/2
则 [ 2 i − 1 , 2 i ) [2^{i-1}, 2^i) [2i−1,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)组成一个等差数列。