金策_字符串算法选讲 学习笔记

似乎有很多很有趣的结论啊
赶紧来学习一下吧
感觉很多结论都是一环扣一环的,如果前面没有理解好,后面可能就很难看懂了
其实也没学多少,大概也就只有 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[nx+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 sr s s s的一个周期

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的周期。
想了很久,最后是PP告诉我的,画了半天的图似乎没什么用啊。。。
就像论文里面说的,设 d = p − q d=p-q d=pq
如果 i − p > 0 i-p>0 ip>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[ip]=s[ip+q]=s[id]
否则,则是 i ≤ p i \le p ip,那么就会有 i + q ≤ ∣ S ∣ i+q\le|S| i+qS
同样的套路 s [ i + q ] = s [ i − q + p ] = s [ i + d ] s[i+q]=s[i-q+p]=s[i+d] s[i+q]=s[iq+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 2u>=v,那么 u u u v v v里面出现的位置成一个等差数列
如果只匹配了两次,那么显然满足
否则,设第一次和第二次匹配的位置相差了 d d d
那么可以知道 d d d u u u的一个周期
设有另外一个匹配,和第二次相差了 p p p
因为 d , p &lt; = ∣ u ∣ d,p&lt;=|u| dp<=u
那么显然有 ( p , d ) (p,d) (p,d)是原串的一个周期
可以发现, d d d一定是最小的周期,那么可以得到 d ∣ p d|p dp
可以发现,如果 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 np,另外一个为 n − q n-q nq
那么可以知道 ( p , q ) (p,q) (p,q) s s s的周期,同样的,因为 p p p是最小的,所以 p ∣ q p|q pq
那么也就是 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).....[2i1,2i),[2i,n)
对于 [ 2 i , n ) [2^i,n) [2i,n)之前已经证明过是等差数列
我们只需要讨论 [ 2 i − 1 , 2 i ) [2^{i-1},2^i) [2i1,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] [2i1,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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值