浅谈“随机按键指定串”问题
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 的概率”,题目:
这个问题实际上很古老, 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=m1c∑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=m1c∑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−m1fδ(πi,si+1)+m1fi+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=m1c∑fδ(0,c)+1=m1f1+mm−1f0+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。
这样我们避免了复杂的数学推演,只使用了简单的期望递推,本问题就此告段落。
一个古老的类似问题:
希望本文章对你有帮助。
更多推荐



所有评论(0)