Preface

主要作为培训时该类问题的总结。

Introduction

这类问题的主要形式是:

m m m 个不同的字符按键,进行 n n n 次(或无限次)随机敲打。

询问 n n n 个字符中出现长度为 k k k 的指定串 S S S 的概率。

或求无限次敲打中 S S S 出现位置的期望。

首先,这个问题是与 KMP 有关的,我们知道 B o r d e r \rm{Border} Border 串是原串的前后缀,那么从感性的角度理解, B o r d e r \rm{Border} Border 越长, S S S 越容易在匹配失败时恢复更长的前缀,使得出现概率更大、位置期望更靠前。

对于问题“ n n n 个字符中出现长度为 k k k 的指定串 S S S 的概率”,题目:

Mivik 的标题

这个问题实际上很古老, B o r d e r \rm{Border} Border 理论中有 B o r d e r \rm{Border} Border 串可分为 O ( log ⁡ k ) O(\log k) O(logk) 个等差数列的描述,根据推出的 DP 式子使用该理论与半在线卷积、高斯消元、多项式求逆、生成函数等操作便可以有效地求出。

在该题目的题解区已有丰富的解答,这里不多赘言。

而对于问题“无限次敲打中 S S S 出现位置的期望”,理论上可以运用上面的结论,在无限求和中使用数列等合并的方法。

但实际上对于无限问题,如果是收敛的,期望递推式并不会过于丑陋。

f i f_i fi S S S i i i 位到 S S S 最后一个字符出现的期望,根据 KMP 自动机有这么一个函数:

δ ( i , c ) = { i + 1 , c = s i + 1 δ ( π i , c ) , e l s e \delta(i,c)=\begin{cases} i+1, & c=s_{i+1} \\ \delta(\pi_i,c), & else \end{cases} δ(i,c)={i+1,δ(πi,c),c=si+1else

其中 π i \pi_i πi 即位置 i i i B o r d e r \rm{Border} Border 长度。

所以把 f i f_i fi 拆分可能的转移易得:

f i = 1 m ∑ c f δ ( i , c ) + 1 f_i=\frac{1}{m}\sum_{c} f_{\delta(i,c)}+1 fi=m1cfδ(i,c)+1

我们对比 f π i f_{\pi_i} fπi

f π i = 1 m ∑ c f δ ( π i , c ) + 1 f_{\pi_i}=\frac{1}{m}\sum_{c} f_{\delta(\pi_i,c)}+1 fπi=m1cfδ(πi,c)+1

做一次容斥:

f i = f π i − 1 m f δ ( π i , s i + 1 ) + 1 m f i + 1 f_i=f_{\pi_i}-\frac{1}{m}f_{\delta(\pi_i,s_{i+1})}+\frac{1}{m}f_{i+1} fi=fπim1fδ(πi,si+1)+m1fi+1

f i f_i fi 作为期望的定义是倒着走的,我们为了方便处理,设 g i = f i − f 0 g_i=f_i-f_0 gi=fif0,那么显然 g 0 = 0 g_0=0 g0=0

而由前面:

f 0 = 1 m ∑ c f δ ( 0 , c ) + 1 = 1 m f 1 + m − 1 m f 0 + 1 f_0=\frac{1}{m}\sum_{c} f_{\delta(0,c)}+1=\frac{1}{m}f_1+\frac{m-1}{m}f_0+1 f0=m1cfδ(0,c)+1=m1f1+mm1f0+1

化简有 f 1 − f 0 = − m f_1-f_0=-m f1f0=m,也就是 g 1 = − m g_1=-m g1=m

g i g_i gi 代入容斥后的式子:

g i + f 0 = g π i + f 0 − 1 m ( g δ ( π i , s i + 1 ) + f 0 ) + 1 m ( g i + 1 + f 0 ) g_i+f_0=g_{\pi_i}+f_0-\frac{1}{m}(g_{\delta(\pi_i,s_{i+1})}+f_0)+\frac{1}{m}(g_{i+1}+f_0) gi+f0=gπi+f0m1(gδ(πi,si+1)+f0)+m1(gi+1+f0)

不难发现 f 0 f_0 f0 可以消掉:

g i + 1 = m ( g i − g π i ) + g δ ( π i , s i + 1 ) g_{i+1}=m(g_i-g_{\pi_i})+g_{\delta(\pi_i,s_{i+1})} gi+1=m(gigπi)+gδ(πi,si+1)

B o r d e r \rm{Border} Border 串预处理, δ \delta δ 函数是 O ( log ⁡ k ) O(\log k) O(logk) 的,于是这就是一个普通的 O ( n log ⁡ k ) O(n \log k) O(nlogk) 递推式子。

我们要的位置期望就是 f 0 f_0 f0,也就是 f k − g k f_k-g_k fkgk f k f_k fk 已经代表 S S S 的最后一个位置了,敲打次数期望为 0 0 0,则 f 0 = − g k f_0=-g_k f0=gk

这样我们避免了复杂的数学推演,只使用了简单的期望递推,本问题就此告段落。

一个古老的类似问题:

[CTSC2006] 歌唱王国

希望本文章对你有帮助。

Logo

一站式 AI 云服务平台

更多推荐