【LOJ 2004】「SDOI2017」硬幣遊戲
阿新 • • 發佈:2019-04-04
直接 未知數 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」硬幣遊戲