浅谈“随机按键指定串”问题
Preface
首先这真的只是浅谈,这个问题还是比较有限的。
Introduction
这类问题的主要形式是:
有 \(m\) 个不同的字符按键,进行 \(n\) 次(或无限次)随机敲打。
询问 \(n\) 个字符中出现长度为 \(k\) 的指定串 \(S\) 的概率。
或求无限次敲打中 \(S\) 出现位置的期望。
首先,这个问题是与 KMP 有关的,我们知道 \(\rm{Border}\) 串是原串的前后缀,感性的角度理解,\(\rm{Border}\) 越长,\(S\) 越容易在失配时恢复更长的前缀,使得出现概率更大、位置期望更靠前。
Problem 1
对于问题“\(n\) 个字符中出现长度为 \(k\) 的指定串 \(S\) 的概率”,题目:
这个问题很古老,\(\rm{Border}\) 理论中有 \(\rm{Border}\) 数组可分为 \(\mathcal{O}(\log k)\) 个等差数列的论断,根据推出的 DP 式子使用该理论与半在线卷积、高斯消元、多项式求逆、生成函数等操作便可以有效地求出,这题的题解区已经讲得很丰富了。
我们讨论一个 \(n\) 很大、字符集有限的情况(也是该题的部分分,但是该题为了迎合正解,\(n\) 是比较小的):
根据 KMP 自动机有这么一个函数:
其中 \(\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_{\pi_i}\):
做一次容斥:
\(f_i\) 作为期望的定义是倒着走的,为了方便处理,设 \(g_i=f_i-f_0\),那么显然 \(g_0=0\)。
而由前面:
化简有 \(f_1-f_0=-m\),也就是 \(g_1=-m\)。
把 \(g_i\) 代入容斥后的式子:
不难发现 \(f_0\) 可以消掉:
\(\rm{Border}\) 串预处理,\(\delta\) 函数本质与 KMP 等价,每个位置均摊后是 \(\mathcal{O}(1)\),于是这就是线性 \(\mathcal{O}(k)\) 的。
我们要的位置期望就是 \(f_0\),也就是 \(f_k-g_k\),\(f_k\) 已经代表 \(S\) 的最后一个位置了,敲打次数期望为 \(0\),则 \(f_0=-g_k\)。
这样我们避免了复杂的数学,只使用了简单的期望递推。
类似问题:
希望本文章对你有帮助。
Update
2026.11.07 - 补充并修正了部分内容。
2026.11.12 - 修正了 Problem 2 的部分内容。

浙公网安备 33010602011771号