似乎有很多很有趣的结论啊
赶紧来学习一下吧
感觉很多结论都是一环扣一环的,如果前面没有理解好,后面可能就很难看懂了
其实也没学多少,大概也就只有
10
10
10页把23333
把需要用到的结论学了就跑了
符号定义
s
[
i
,
j
]
=
s
[
i
]
s
[
i
+
1
]
s
[
i
+
2
]
.
.
.
.
.
s
[
j
]
s[i,j]=s[i]s[i+1]s[i+2].....s[j]
s[i,j]=s[i]s[i+1]s[i+2].....s[j]
p
r
e
(
s
,
x
)
=
s
[
1....
x
]
pre(s,x)=s[1....x]
pre(s,x)=s[1....x]
s
u
f
(
s
,
x
)
=
s
[
n
−
x
+
1....
n
]
suf(s,x)=s[n-x+1....n]
suf(s,x)=s[n−x+1....n]
(
p
,
q
)
=
g
c
d
(
p
,
q
)
(p,q)=gcd(p,q)
(p,q)=gcd(p,q)
周期
如果对于任意一个 i i i,有 s [ i ] = s [ i + d ] s[i]=s[i+d] s[i]=s[i+d],那么 d d d就是 s s s的一个周期
border
如果对于一个
r
r
r,满足
p
r
e
(
s
,
r
)
=
s
u
f
(
s
,
r
)
pre(s,r)=suf(s,r)
pre(s,r)=suf(s,r),那么
p
r
e
(
s
,
r
)
pre(s,r)
pre(s,r)就称为
s
s
s的一个
b
o
r
d
e
r
border
border
你会发现,KMP算法里面,
f
a
i
l
i
fail_i
faili就是
s
[
1
,
i
]
s[1,i]
s[1,i]最大的
b
o
r
d
e
r
border
border
p
r
e
(
s
,
r
)
pre(s,r)
pre(s,r)是
s
s
s的一个
b
o
r
d
e
r
border
border,那么可以得到
∣
s
∣
−
r
|s|-r
∣s∣−r是
s
s
s的一个周期
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的周期。
想了很久,最后是PP告诉我的,画了半天的图似乎没什么用啊。。。
就像论文里面说的,设
d
=
p
−
q
d=p-q
d=p−q
如果
i
−
p
>
0
i-p>0
i−p>0
那么则有
s
[
i
]
=
s
[
i
−
p
]
=
s
[
i
−
p
+
q
]
=
s
[
i
−
d
]
s[i]=s[i-p]=s[i-p+q]=s[i-d]
s[i]=s[i−p]=s[i−p+q]=s[i−d]
否则,则是
i
≤
p
i \le p
i≤p,那么就会有
i
+
q
≤
∣
S
∣
i+q\le|S|
i+q≤∣S∣
同样的套路
s
[
i
+
q
]
=
s
[
i
−
q
+
p
]
=
s
[
i
+
d
]
s[i+q]=s[i-q+p]=s[i+d]
s[i+q]=s[i−q+p]=s[i+d]
那么我们就可以推出
s
[
i
]
=
s
[
i
+
d
]
s[i]=s[i+d]
s[i]=s[i+d]了,也就是
d
d
d是一个周期
根据更相减损术,自然可以得到,
g
c
d
(
p
,
d
)
gcd(p,d)
gcd(p,d)也是一个周期
引理1
两个字符串,
u
,
v
u,v
u,v,如果满足
2
∣
u
∣
>
=
v
2|u|>=v
2∣u∣>=v,那么
u
u
u在
v
v
v里面出现的位置成一个等差数列
如果只匹配了两次,那么显然满足
否则,设第一次和第二次匹配的位置相差了
d
d
d
那么可以知道
d
d
d是
u
u
u的一个周期
设有另外一个匹配,和第二次相差了
p
p
p
因为
d
,
p
<
=
∣
u
∣
d,p<=|u|
d,p<=∣u∣
那么显然有
(
p
,
d
)
(p,d)
(p,d)是原串的一个周期
可以发现,
d
d
d一定是最小的周期,那么可以得到
d
∣
p
d|p
d∣p
可以发现,如果
p
p
p满足,那么
d
,
2
d
,
3
d
,
4
d
.
.
.
.
p
d,2d,3d,4d....p
d,2d,3d,4d....p一定满足
引理2
对于字符串
s
s
s,任何一个不小于
∣
s
∣
/
2
|s|/2
∣s∣/2的
b
o
r
d
e
r
border
border长度组成一个等差数列
设最大的
b
o
r
d
e
r
border
border长度为
n
−
p
n-p
n−p,另外一个为
n
−
q
n-q
n−q
那么可以知道
(
p
,
q
)
(p,q)
(p,q)是
s
s
s的周期,同样的,因为
p
p
p是最小的,所以
p
∣
q
p|q
p∣q
那么也就是
n
−
(
p
,
q
)
n-(p,q)
n−(p,q)也是原串的一个
b
o
r
d
e
r
border
border
引理3
一个字符串
s
s
s,所有的
b
o
r
d
e
r
border
border长度排序,可以分成
l
o
g
log
log段,每一段都是一个等差数列
我们对
b
o
r
d
e
r
border
border长度
x
x
x进行分类,
[
1
,
2
)
,
[
2
,
4
)
,
[
4
,
8
)
.
.
.
.
.
[
2
i
−
1
,
2
i
)
,
[
2
i
,
n
)
[1,2),[2,4),[4,8).....[2^{i-1},2^{i}),[2^i,n)
[1,2),[2,4),[4,8).....[2i−1,2i),[2i,n)
对于
[
2
i
,
n
)
[2^i,n)
[2i,n)之前已经证明过是等差数列
我们只需要讨论
[
2
i
−
1
,
2
i
)
[2^{i-1},2^i)
[2i−1,2i)的即可
我们把
p
r
e
(
s
,
2
i
)
pre(s,2^i)
pre(s,2i)和
s
u
f
(
s
,
2
i
)
suf(s,2^i)
suf(s,2i)拿出来,记作
u
,
v
u,v
u,v
我们只需要讨论这里面,长度
k
k
k在
[
2
i
−
1
,
2
i
]
[2^{i-1},2^i]
[2i−1,2i]的,满足
p
r
e
(
u
,
k
)
=
s
u
f
(
v
,
k
)
pre(u,k)=suf(v,k)
pre(u,k)=suf(v,k)即可
找到最大的一个
x
x
x,那么剩下的一定是
x
x
x的
b
o
r
d
e
r
border
border,根据引理二就可以得证了
这也启示我们,如果询问我们 s [ l , r ] s[l,r] s[l,r]里面的周期/ b o r d e r border border,可以用 l o g log log个等差数列表示出来
引理4
引理3套用在回文串上面也同样使用
因为我们找到最大的一个回文后缀
那么可以发现,这个后缀的每一个
b
o
r
d
e
r
border
border都是一个回文串,且每一个回文后缀都是一个
b
o
r
d
e
r
border
border
如果x,y均为回文串,且y为x的一个后缀,那么y为x的一个border