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+1​else​

其中 π 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​=m1​c∑​fδ(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​​=m1​c∑​fδ(π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πi​​−m1​fδ(πi​,si+1​)​+m1​fi+1​

f i f_i fi​ 作为期望的定义是倒着走的,我们为了方便处理,设 g i = f i − f 0 g_i=f_i-f_0 gi​=fi​−f0​,那么显然 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​=m1​c∑​fδ(0,c)​+1=m1​f1​+mm−1​f0​+1

化简有 f 1 − f 0 = − m f_1-f_0=-m f1​−f0​=−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​​+f0​−m1​(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(gi​−gπ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 fk​−gk​, f k f_k fk​ 已经代表 S S S 的最后一个位置了,敲打次数期望为 0 0 0,则 f 0 = − g k f_0=-g_k f0​=−gk​。

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

一个古老的类似问题:

[CTSC2006] 歌唱王国

希望本文章对你有帮助。

Logo

一站式 AI 云服务平台

更多推荐