字符串算法选讲

符号与约定

s [ 1... x ] = s [ 1 ] s [ 2 ] s [ 3 ] . . . s [ x ] s[1...x]=s[1]s[2]s[3]...s[x] s[1...x]=s[1]s[2]s[3]...s[x]组成的字符串

p r e [ s , x ] = s [ 1... x ] , s u f [ s , x ] = s [ ∣ S ∣ − x + 1... ∣ S ∣ ] pre[s,x]=s[1...x],suf[s,x]=s[|S|-x+1...|S|] pre[s,x]=s[1...x],suf[s,x]=s[Sx+1...S]

周期和border

对于一个 0 &lt; p ≤ ∣ S ∣ 0&lt; p\le|S| 0<pS,若满足对于任意 i ∈ [ 1 , ∣ S ∣ − p ] i\in[1,|S|-p] i[1,Sp] s i = s i + p s_i=s_{i+p} si=si+p,则称 p p p是该串的一个周期

对于一个 0 ≤ r &lt; ∣ S ∣ 0\leq r&lt;|S| 0r<S,若满足 p r e [ s , r ] = s u f [ s , r ] pre[s,r]=suf[s,r] pre[s,r]=suf[s,r],则 r r r是该串的一个 b o r d e r border border

周期与 b o r d e r border border存在转化关系如下

p r e [ s , r ] pre[s,r] pre[s,r]是该串的 b o r d e r border border ⇔ \Leftrightarrow ∣ S ∣ − r |S|-r Sr是该串的一个周期

一个简明的小结论

l c p ( A , B ) lcp(A,B) lcp(A,B)表示 A , B A,B A,B两个串的最长公共前缀

对于拥有周期 p p p的串 S S S,一定满足的是 l c p ( s [ 1... ∣ S ∣ ] , s [ 1 + p . . . ∣ S ∣ ] ) = ∣ S ∣ − p lcp(s[1...|S|],s[1+p...|S|])=|S|-p lcp(s[1...S],s[1+p...S])=Sp

然后可以做的就是对于一个位置 x x x,找到最大的一个 l l l满足 s [ x . . . x + l − 1 ] s[x...x+l-1] s[x...x+l1]有周期 P P P

S A SA SA求一下 s [ x . . . ∣ S ∣ ] s[x...|S|] s[x...S] s [ x + P . . . ∣ S ∣ ] s[x+P...|S|] s[x+P...S] l c p lcp lcp即可…

Weak Periodicity Lemma

对于一个字符串 S S S的周期 p , q p,q p,q,若 p + q ≤ ∣ S ∣ p+q\leq |S| p+qS,则 g c d ( p , q ) gcd(p,q) gcd(p,q)也是 S S S的周期

钦定 p &gt; q p&gt;q p>q,不妨设 d = p − q d=p-q d=pq,对于某个 i i i分类讨论

i &gt; p i&gt;p i>p,则 i − p &gt; 0 i-p&gt;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\leq p ip,则 i + q ≤ ∣ S ∣ i+q\leq |S| i+qS,故 s [ i ] = s [ i + q ] = s [ i + q − p ] = s [ i − d ] s[i]=s[i+q]=s[i+q-p]=s[i-d] s[i]=s[i+q]=s[i+qp]=s[id]

然后我们就发现了一个新的周期 d d d,发现他们在更相减损,故得证

Periodicity Lemma(拓展

对于一个字符串 S S S的周期 p , q p,q p,q,若 p + q − g c d ( p , q ) ≤ ∣ S ∣ p+q-gcd(p,q)\leq |S| p+qgcd(p,q)S,则 g c d ( p , q ) gcd(p,q) gcd(p,q)也是 S S S的周期

证明貌似还不会…

字符串匹配的结论(引理1

若字符串 u , v u,v u,v满足 2 ∣ u ∣ ≥ ∣ v ∣ 2|u|\ge |v| 2uv,则 u u u v v v中的所有匹配位置组成一个等差数列

考虑在序列中第一次匹配,第二次匹配以及另外某一次匹配

设第一次与第二次的间距为 d d d,第二次与另外一次的间距为 q q q

可以发现的是 u u u的最小周期 p p p也是第一次匹配和第二次匹配的并的周期

同时 d d d也是该串周期, g c d ( d , q ) gcd(d,q) gcd(d,q)也为该串周期

p &lt; d p&lt;d p<d,那么第二次匹配相差不应为 d d d,故 p ≥ d p\ge d pd,所以 d = p ≤ g c d ( d , q ) d=p\leq gcd(d,q) d=pgcd(d,q),故有 d ∣ q d|q dq

字符串匹配的结论(引理2

由上推导可知

若字符串 u , v u,v u,v满足 2 ∣ u ∣ &gt; ∣ v ∣ 2|u|&gt;|v| 2u>v,且出现次数超过 2 2 2,则其构成的等差数列公差为 u u u的最小周期 p p p

证明如上

Border的结构

字符串 S S S的所有不小于 ∣ S ∣ 2 \frac{|S|}{2} 2S b o r d e r border border长度组成一个等差数列

策爷的论文证明貌似有点奇怪…

并不是很清楚为什么 p ∣ q p|q pq之后就直接等差了…

yy了一个东西,就是已经可以证明 p ∣ q p|q pq,那么就是所有都是其倍数,只需要证明能出来 n − p , n − 2 p n-p,n-2p np,n2p的这些 b o r d e r border border就可以了…注意到最小周期是 p p p,那么显然其倍数也是周期,周期对应了 b o r d e r border border,故得证

Border的进一步推论

根据如上的一个引理,我们已经证明了对于一个串,其所有长度不小于其一半的 b o r d e r border border是一个等差数列

考虑更小的,对其进行按长度的二进制分组,即 [ 1 , 2 ) , [ 2 , 4 ) , [ 4 , 8 ) . . . [ 2 k , n ) [1,2),[2,4),[4,8)...[2^k,n) [1,2),[2,4),[4,8)...[2k,n)的各位一类

对于在某个类中的 b o r d e r border border,考虑其最长的,那么剩下的所有 b o r d e r border border一定都是最长的那个 b o r d e r border border b o r d e r border border

故以最长的 b o r d e r border border为母串,第一个的结论变成立了,故有如下进一步的结论

字符串 S S S的所有 b o r d e r border border能划分成 log ⁡ ∣ S ∣ \log |S| logS个等差数列,对其二进制分组即可

一个例题

一个串 S S S,多次询问 S [ l . . . r ] S[l...r] S[l...r]的所有 b o r d e r border border,用等差数列表示

对每个 [ 2 i , 2 i + 1 ) [2^i,2^{i+1}) [2i,2i+1)考虑,若 p r e ( S , u ) = s u f ( S , u ) pre(S,u)=suf(S,u) pre(S,u)=suf(S,u) u ∈ [ 2 i , 2 i + 1 ) u\in[2^i,2^{i+1}) u[2i,2i+1),则一定有 p r e ( S , 2 i ) pre(S,2^i) pre(S,2i)是该 b o r d e r border border的前缀, s u f ( S , 2 i ) suf(S,2^i) suf(S,2i)是该 b o r d e r border border的后缀

在这里插入图片描述

求出 p r e ( S , 2 i ) pre(S,2^i) pre(S,2i) s u f ( S , 2 i + 1 ) suf(S,2^{i+1}) suf(S,2i+1)中的所有匹配位置,以及 s u f ( S , 2 i ) suf(S,2^i) suf(S,2i) p r e ( S , 2 i + 1 ) pre(S,2^{i+1}) pre(S,2i+1)中的所有匹配位置

翻转区间取交即可

注意这里的匹配运用引理1可知,均是公差相同的等差数列,故而取交可以做到 O ( 1 ) O(1) O(1)

把border拓展到回文串上

引理:对于一个回文串 S S S,其的一个后缀 s u f ( S , x ) suf(S,x) suf(S,x)也是回文串当且仅当 p r e ( S , x ) = s u f ( S , x ) pre(S,x)=suf(S,x) pre(S,x)=suf(S,x),即其也为 b o r d e r border border

推论:一个字符串的所有回文后缀的长度可以表示为 log ⁡ ∣ S ∣ \log |S| logS个等差数列

证明:我是sb,找到最长回文后缀之后就变成了回文串的问题了…

双回文串

如果 S = a b S=ab S=ab,满足 a , b a,b a,b均为回文串,则称 S S S是一个双回文串

引理1:如果 S S S是一个双回文串,则存在一种拆分方法 S = a b S=ab S=ab,满足 a a a是其最长回文前缀或 b b b是其最长回文后缀

引理2:如果 S = x 1 x 2 = y 1 y 2 = z 1 z 2 ( ∣ x 1 ∣ &lt; ∣ y 1 ∣ &lt; ∣ z 1 ∣ ) S=x1x2=y1y2=z1z2 (|x1|&lt;|y1|&lt;|z1|) S=x1x2=y1y2=z1z2x1<y1<z1,满足 x 2 , y 1 , y 2 , z 1 x2,y1,y2,z1 x2,y1,y2,z1均是回文串,则 x 1 , z 2 x1,z2 x1,z2也为回文串

Lyndon word

满足 S S S的最小后缀是 S S S本身的串称为 L y n d o n w o r d Lyndon word Lyndonword

引理1: u , v u,v u,v均为 L y n d o n Lyndon Lyndon串,且 u &lt; v u&lt;v u<v,则 u v uv uv也为 L y n d o n Lyndon Lyndon

引理2:任意一个字符串 S S S可以划分为 S = s 1 s 2 s 3.. S=s1s2s3.. S=s1s2s3..,满足 s 1 s 2 s 3 s1s2s3 s1s2s3均为 L y n d o n Lyndon Lyndon串且 s i ≥ s i + 1 s_i\ge s_{i+1} sisi+1,且这种分解方法是唯一的

我们初始将其设为一段一个字符,每次合并相邻的满足 s i &lt; s i + 1 s_i&lt;s_{i+1} si<si+1的串,根据引理1这仍是一个 L y n d o n Lyndon Lyndon

Duval’s Algorithm

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值