「典」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\) 个未知数,高斯消元即可。