题解 LOJ2004 「SDOI2017」硬币游戏

考虑建出AC自动机。则问题相当于,我们每步会从节点\(i\)等概率地走向\(\text{trans}(i,0)\)\(\text{trans}(i,1)\)。给定了一个起点和若干个终点,求从每个终点结束的概率。

因为到达一个终点后游戏就结束了,我们不会继续走,所以每个终点被经过的次数要么是\(0\),要么是\(1\)。因此,从每个终点结束的概率,在数值上就等于它被经过的期望次数。

\(E_{i}\)表示经过AC自动机上节点\(i\)被经过的期望次数。则有转移:

\[E_{u}=\sum_{v\rightarrow u}p(v,u)E_{v}+[u\text{是起点}] \]

因为AC自动机的节点数是\(O(nm)\)的,所以用高斯消元解上述方程组的时间复杂度是\(O(n^3m^3)\)。无法承受。

考虑优化。发现我们并不关心除若干个终点外的其它节点的\(E\)值。而终点的数量只有\(O(n)\)级别。

\(E_0\)表示所有非终点节点的期望经过次数之和,\(E_i\)表示第\(i\)个终点的期望经过次数。

首先,因为最终必定会从某个终点出去(也就是游戏必有一个赢家),所以\(\sum_{i=1}^{n}E_i=1\)

考虑从任意一个非终点节点出发,按照第\(i\)个人给定的硬币序列,依次经过\(m\)条转移边,最后一定能走到第\(i\)个终点。所以我们初步认为\(E_i=\frac{1}{2^m}E_0\)。但是这样等于是说所有人获胜的概率一样大,显然不对。

这样做的问题在于,有可能在你走这\(m\)步的路径上,还没走到你想要去的终点\(i\),就半路遇上了另一个终点\(j\),游戏立刻终止,于是你就无法到达\(i\)了!所以\(\frac{1}{2^m}E_0\)这个期望,不能全贡献到\(E_i\)上,也会贡献到中途经过的节点上。

发现这种情况发生时,一定是存在一个\(1\leq k<m\),使得串\(i\)的一个长为\(k\)的前缀,等于串\(j\)的一个长为\(k\)的后缀。并且在你出发的这个非终点节点上,\(j\)已经匹配好了前\(m-k\)位。接下来你按\(i\)的序列走,只要走出了前\(k\)位,立刻就被终点\(j\)截胡。需要特别注意的是,\(i\)可能等于\(j\)

综上,我们对每个\(i\)可以列出方程:

\[E_i+\sum_{j=1}^{n}\left(\sum_{k=1}^{m-1}[\operatorname{pre}(i,k)=\operatorname{suf}(j,k)]\frac{1}{2^{m-k}}\right)E_j-\frac{1}{2^m}E_0=0 \]

判断\(\operatorname{pre}(i,k)=\operatorname{suf}(j,k)\)可以用后缀数组或哈希简单实现。

加上前面列出的\(\sum_{i=1}^{n}E_i=1\)这个方程。我们一共有\(n+1\)个方程,\(n+1\)个未知数,直接高斯消元即可。

时间复杂度\(O(n^3)\)

参考代码

猜你喜欢

转载自www.cnblogs.com/dysyn1314/p/12652253.html