1. 程式人生 > >bzoj1444 有趣的遊戲(AC自動機+概率dp)

bzoj1444 有趣的遊戲(AC自動機+概率dp)

大寫字母 叠代 字符串 字符 時間復雜度 單詞 分析 出現 ron

題意:

給定n個長度為l的模式串,現在要用前m個大寫字母生成一個隨機串,每個字符有自己的出現幾率,第一次出現的字符串獲勝,求最終每個字符串的獲勝幾率。

分析:

容易想到先把所有的字符串建成一個AC自動機

然後對於生成的隨機串就相當於從AC自動機的root開始在自動機上走,然後求走到每個單詞節點的概率

因為這是存在環的,不是DAG圖,所以不能直接DP

考慮構造出剛開始的轉移矩陣,然後對轉移矩陣作矩陣乘法不斷叠代就能得到正確答案了

轉移矩陣如何建呢?

  1)a[i][ch[i][j]]+=p[j] (普通的轉移,註意一定要累加,不能直接賦值

  2)若某個節點是danger節點,那麽根據題意,它是說明已經提前走完了一個字符串,不能再走離這個位置,所以對於這種節點,只能a[i][i]=1.0,其他不要

時間復雜度O(K*(nm)^3)

bzoj1444 有趣的遊戲(AC自動機+概率dp)