1. 程式人生 > >【LOJ 2004】「SDOI2017」硬幣遊戲

【LOJ 2004】「SDOI2017」硬幣遊戲

直接 未知數 pts class 現在 註意 出現 inline 前綴

LOJ 2004 100pts

首先我們肯定要建AC自動機的。。

那麽這題就肯定是個AC自動機上\(dp\)

所以想想狀態。

首先如果我們把狀態設成這樣行不行:

\(dp(i)\)表示匹配到了i節點的概率。

那麽轉移的時候就是\(dp(i)=frac{1}{2}\sum dp(go_i^c)\)

這樣的轉移是有環的。。。所以高斯消元。。。

但是!AC自動機的節點數是\(O(n^2)\)的。。。

所以T得飛起。。

那麽試著改一改?

改為\(dp(i)\)直接表示第i個串第一次出現的概率?

那麽轉移很難啊。

如果我們當前的串為\(S\),並且沒有任何的串在其中出現過,設所有的\(S\)的概率綜合為\(fail\)

那麽我們在\(S\)後硬生生地加上\(s_i\),那麽這個概率是\(fail\times frac{1}{2}^m\)

但是可能中間會有某個\(s_j\)出現。

那麽現在的串可以變形成\(S\)的一個前綴\(+s_j+s_i\)的一個後綴

其中\(s_i\)的一個前綴和\(s_j\)的一個後綴匹配。(這不就是\(fail\)指針嗎!

其中的概率是\(dp(j)\times frac{1}{2}^{len(suf(s_i))}\)

所以轉移方程就出來了。

但是。。。這個還是有環的。。。所以高斯消元。。。

可惜我們只有\(n\)個方程,卻有\(n+1\)個未知數。

但註意到所有串第一次出現的概率之和為\(1\)

就釋然了。

做完了。。。

【LOJ 2004】「SDOI2017」硬幣遊戲