考慮建出ac自動機。則問題相當於,我們每步會從節點\(i\)等概率地走向\(\text(i,0)\)或\(\text(i,1)\)。給定了乙個起點和若干個終點,求從每個終點結束的概率。
因為到達乙個終點後遊戲就結束了,我們不會繼續走,所以每個終點被經過的次數要麼是\(0\),要麼是\(1\)。因此,從每個終點結束的概率,在數值上就等於它被經過的期望次數。
設\(e_\)表示經過ac自動機上節點\(i\)被經過的期望次數。則有轉移:
\[e_=\sum_p(v,u)e_+[u\text]
\]因為ac自動機的節點數是\(o(nm)\)的,所以用高斯消元解上述方程組的時間複雜度是\(o(n^3m^3)\)。無法承受。
考慮優化。發現我們並不關心除若干個終點外的其它節點的\(e\)值。而終點的數量只有\(o(n)\)級別。
設\(e_0\)表示所有非終點節點的期望經過次數之和,\(e_i\)表示第\(i\)個終點的期望經過次數。
首先,因為最終必定會從某個終點出去(也就是遊戲必有乙個贏家),所以\(\sum_^e_i=1\)。
考慮從任意乙個非終點節點出發,按照第\(i\)個人給定的硬幣序列,依次經過\(m\)條轉移邊,最後一定能走到第\(i\)個終點。所以我們初步認為\(e_i=\frace_0\)。但是這樣等於是說所有人獲勝的概率一樣大,顯然不對。
這樣做的問題在於,有可能在你走這\(m\)步的路徑上,還沒走到你想要去的終點\(i\),就半路遇上了另乙個終點\(j\),遊戲立刻終止,於是你就無法到達\(i\)了!所以\(\frace_0\)這個期望,不能全貢獻到\(e_i\)上,也會貢獻到中途經過的節點上。
發現這種情況發生時,一定是存在乙個\(1\leq k,使得串\(i\)的乙個長為\(k\)的字首,等於串\(j\)的乙個長為\(k\)的字尾。並且在你出發的這個非終點節點上,\(j\)已經匹配好了前\(m-k\)位。接下來你按\(i\)的序列走,只要走出了前\(k\)位,立刻就被終點\(j\)截胡。需要特別注意的是,\(i\)可能等於\(j\)。
綜上,我們對每個\(i\)可以列出方程:
\[e_i+\sum_^\left(\sum_^[\operatorname(i,k)=\operatorname(j,k)]\frac}\right)e_j-\frace_0=0
\]判斷\(\operatorname(i,k)=\operatorname(j,k)\)可以用字尾陣列或雜湊簡單實現。
加上前面列出的\(\sum_^e_i=1\)這個方程。我們一共有\(n+1\)個方程,\(n+1\)個未知數,直接高斯消元即可。
時間複雜度\(o(n^3)\)。
參考**
題解 LOJ540遊戲
小l計畫進行n場遊戲,每場遊戲使用一張地圖,小 l 會同時使用三輛車在該地圖上完成遊戲。小 l 的賽車有三輛,分別用大寫字母 a b c 表示。地圖是一張無向簡單圖 沒有重邊或自環 每次他會在地圖中選擇不同的三個點 i,j,k滿足 i且兩兩之間均有邊。此時他會讓 a 從i到j,b 從j到k,c從k到...
題解 Loj2727舞會
n 個數,其中有 m 個位置的數是確定的,另外的數隨意排列。每次操作把最前面三個數取出,把它們的中位數取出來放到最後,然後刪掉這三個數。通過合適的排列,使最後留下來的數最大。首先這類有關中位數的問題,可以二分後轉化為操作 01 序列的問題。每次二分乙個有可能的答案 mid 把 mid 換成一,的數換...
loj6274 數字 題解
ppt 首先考慮樸素做法。我們列舉 v 檢查是否能存在 x 和 y 滿足 x land y v 設dp狀態 f i,0 1,0 1,0 1,0 1 表示當前考慮了前 i 位,是否存在一組 x 和 y 滿足 x land y v x lor y t lx leq x leq rx ly leq y l...