浅谈“随机按键指定串”问题

Preface

首先这真的只是浅谈,这个问题还是比较有限的。

Introduction

这类问题的主要形式是:

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

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

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

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

Problem 1

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

Mivik 的标题

这个问题很古老,\(\rm{Border}\) 理论中有 \(\rm{Border}\) 数组可分为 \(\mathcal{O}(\log k)\) 个等差数列的论断,根据推出的 DP 式子使用该理论与半在线卷积、高斯消元、多项式求逆、生成函数等操作便可以有效地求出,这题的题解区已经讲得很丰富了。

我们讨论一个 \(n\) 很大、字符集有限的情况(也是该题的部分分,但是该题为了迎合正解,\(n\) 是比较小的):

根据 KMP 自动机有这么一个函数:

\[\delta(i,c)=\begin{cases} i+1, & c=s_{i+1} \\ \delta(\pi_i,c), & else \end{cases} \]

其中 \(\pi_i\) 即位置 \(i\) 的 \(\rm{Border}\) 长度。

这里指示了一个新的字符是否失配及其去向,我们对此可以构造一个字符集对字符集的连接图,它可以映射到一个矩阵上,这个矩阵就是转移的单位矩阵,把初始状态的矩阵构造出来,使用矩阵快速幂就可以在 \(\mathcal{O}(V^3 \log n)\) 解决此问题,\(V\) 为字符集大小。

Problem 2

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

实际上收敛的无限问题,期望递推式很可能并不会过于丑陋。

记 \(f_i\) 为 \(S\) 第 \(i\) 位到 \(S\) 最后一个字符出现的期望。

同样利用 KMP 的 \(\delta\) 函数,把 \(f_i\) 拆分可能的转移易得:

\[f_i=\frac{1}{m}\sum_{c} f_{\delta(i,c)}+1 \]

我们对比 \(f_{\pi_i}\):

\[f_{\pi_i}=\frac{1}{m}\sum_{c} f_{\delta(\pi_i,c)}+1 \]

做一次容斥:

\[f_i=f_{\pi_i}-\frac{1}{m}f_{\delta(\pi_i,s_{i+1})}+\frac{1}{m}f_{i+1} \]

\(f_i\) 作为期望的定义是倒着走的,为了方便处理,设 \(g_i=f_i-f_0\),那么显然 \(g_0=0\)。

而由前面:

\[f_0=\frac{1}{m}\sum_{c} f_{\delta(0,c)}+1=\frac{1}{m}f_1+\frac{m-1}{m}f_0+1 \]

化简有 \(f_1-f_0=-m\),也就是 \(g_1=-m\)。

把 \(g_i\) 代入容斥后的式子:

\[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) \]

不难发现 \(f_0\) 可以消掉:

\[g_{i+1}=m(g_i-g_{\pi_i})+g_{\delta(\pi_i,s_{i+1})} \]

\(\rm{Border}\) 串预处理,\(\delta\) 函数本质与 KMP 等价,每个位置均摊后是 \(\mathcal{O}(1)\),于是这就是线性 \(\mathcal{O}(k)\) 的。

我们要的位置期望就是 \(f_0\),也就是 \(f_k-g_k\),\(f_k\) 已经代表 \(S\) 的最后一个位置了,敲打次数期望为 \(0\),则 \(f_0=-g_k\)。

这样我们避免了复杂的数学,只使用了简单的期望递推。

类似问题:

[CTSC2006] 歌唱王国

[COCI 2016 / 2017 #7] KLAVIR

希望本文章对你有帮助。

Update

2026.11.07 - 补充并修正了部分内容。

2026.11.12 - 修正了 Problem 2 的部分内容。

posted @ 2026-11-07 17:58  zls_XICK  阅读(25)  评论(0)    收藏  举报