「典」P4548 PGF 解决字符串匹配概率

用概率生成函数理解这个感觉还是挺有用的。

开始有一个空字符串,每次随机加一个字符,如果一个字符串 \(S\) 是当前字符串的子串就停止,求期望次数。

\(n\le 10^5\)

link

\(f_i\) 表示 \(i\) 结束的概率,设其生成函数为 \(F\)

由于要求的是 \(\sum if_i\),所以再设一个 \(g_i\) 表示 \(g\) 时刻没有结束的概率,其生成函数为 \(G\)

\[F(x)=\sum f_i x^i \]

此时套路是,带入 \(x=1\),由于该过程收敛(不会证),所以 \(F(1)=1\)

重要的一步是,考虑在一个未匹配的串后面强制放一个 \(S\),这样一定匹配成功,但是可能不是第一个匹配的位置。

可能在前面匹配了,那么一定是 border 的位置,得到:

\[f_{i+n}=g_i\frac{1}{m^n}-\sum_{k\in \text{Bd}(S),k<n} f_{i+k}\frac{1}{m^{n-k}} \]

写成生成函数:

\[F=\frac{1}{m^n}G x^n-\sum_{k\in \text{Bd}(S),k<n} F\frac{1}{m^{n-k}}x^{n-k} \]

带入 \(x=1\)\(F=1\)

\[1=\frac{1}{m^n}G -\sum_{k\in \text{Bd}(S),k<n} \frac{1}{m^{n-k}}\\ G=\sum_{k\in \text{Bd}(S)} m^k \]

P3706

稍复杂的题。

\(f_{i,j}\) 表示 \(i\)\(j\) 时刻获胜概率,\(g_i\) 表示 \(i\) 时刻未结束概率,同样搞出生成函数。

\[F_i=\frac{1}{2^m}Gx^m - \sum_{j=1}^n\sum_{S_i[1,k]=S_j[m-k+1,m]} F_j\frac{1}{2^{m-k}}x^{m-k} \]

带入 \(x=1\),注意此时是 \(\sum_{i=1}^n F_i(1)=1\)

\[\sum F_i=1\\ F_i=\frac{1}{2^m}G - \sum_{j=1}^n\sum_{S_i[1,k]=S_j[m-k+1,m]} F_j\frac{1}{2^{m-k}} \]

\(n+1\) 个方程, \(n+1\) 个未知数,高斯消元即可。

posted @ 2024-01-25 10:10  houzhiyuan  阅读(59)  评论(0编辑  收藏  举报