• 题解 LOJ2004 「SDOI2017」硬币游戏


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

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

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

    [E_{u}=sum_{v ightarrow u}p(v,u)E_{v}+[u ext{是起点}] ]

    因为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)上,也会贡献到中途经过的节点上。

    发现这种情况发生时,一定是存在一个(1leq 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}} ight)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))

    参考代码

  • 相关阅读:
    网站设计大访问量应用的解决方案
    粘贴剪辑版中的数据
    C#中DateTime
    汇总c#.net常用函数和方法集
    ASP.NET配置文件Web.config 详细解释
    URL验证
    把一个下拉框中的选项添加到另一个中
    显示年月日星期和(变动的)时间
    sqlserver 查询版本号
    FreeMarker(三)Map和List
  • 原文地址:https://www.cnblogs.com/dysyn1314/p/12652253.html
Copyright © 2020-2023  润新知