1. 程式人生 > >[BZOJ1152][CTSC2006]歌唱王國Singleland(KMP + 概率生成函式)

[BZOJ1152][CTSC2006]歌唱王國Singleland(KMP + 概率生成函式)

Address

Solution

  • 看了 yml 大佬的 IOI2018 國家候選隊論文,第一次瞭解到概率生成函式
  • orz YML
  • 先介紹一下概率生成函式
  • 一個離散型隨機變數 X X 的概率生成函式為:
  • F
    ( x ) = i 0
    P ( X = i ) x i
    F(x)=\sum_{i\ge0}P(X=i)x^i
  • 顯然有 F ( 1 ) = 1 F(1)=1
  • 概率生成函式的應用之一就是如果按照上面的定義,則 X X 的期望為
  • F ( 1 ) F'(1)
  • 方差為
  • F ( 1 ) + F ( 1 ) ( F ( 1 ) ) 2 F''(1)+F'(1)-(F'(1))^2
  • 回到原問題,設隨機變數 X X 表示插入多少個字元之後匹配到模式串,其概率生成函式為 F ( x ) F(x)
  • g i g_i 表示插入 i i 個字元之後沒有匹配到模式串的概率,其一般生成函式 G ( x ) G(x)
  • 可以推出兩點性質
  • F ( x ) + G ( x ) = x G ( x ) + 1 F(x)+G(x)=xG(x)+1
  • 解釋: x G ( x ) + 1 xG(x)+1 的第 i i i > 0 i>0 )項實際上是表示插入 i 1 i-1 個字元後沒有匹配成功的概率
  • 而插入 i 1 i-1 個字元後沒有匹配成功,就相當於插入 i i 個字元之後匹配成功或失敗
  • F ( x ) + G ( x ) F(x)+G(x) 的第 i i i > 0 i>0 )項正好對應
  • F ( x ) F(x) 的第 0 0 項為 0 0 G ( x ) G(x) 的第 0 0 項為 1 1
  • G ( x ) × ( 1 n x ) m = i = 1 m a i × F ( x ) × ( 1 n x ) m i G(x)\times(\frac 1nx)^m=\sum_{i=1}^ma_i\times F(x)\times (\frac 1nx)^{m-i}
  • 上面 n n 表示字符集大小, m m 表示模式串長度, a i a_i 表示模式串的長度為 i i 的字首和長度為 i i 的字尾是否相等(可用 KMP 求出),相等則為 1 1 ,不相等則為 0 0
  • 讓我們來解釋下這個看上去沒有實際含義的式子
  • 如果我們現在插入了一些字元,但沒有匹配成功
  • 那麼如果把長度為 m m 的模式串直接追加在我們已經插入的字元後面,就一定能匹配成功,這對應了等號左邊。等號左邊多項式 i + m i+m 次項的意義可以看作匹配成功後不結束操作,但需要滿足在插入 i i 個字元時不能匹配成功,在插入 i + m i+m 個字元時恰好長度為 m m 的字尾與模式串匹配成功的概率
  • 分析一下等號右邊 i + m i+m 次項的含義
  • j = 1 m a j P ( X = i + j ) ( 1 n ) m j \sum_{j=1}^ma_jP(X=i+j)(\frac1n)^{m-j}
  • 列舉 j j 就相當於列舉第一次匹配成功時已經插入了 i + j i+j 個字元
  • 然後還要再插入 m j m-j 個字元,使得當插入的總字元數達到 i + m i+m 時再次匹配成功
  • 這時候就必須滿足模式串的長度為 j j 的字首和長度為長度為 j j 的字尾相等
  • ( 1 n ) m j (\frac 1n)^{m-j} 就表示接下來插入的 m j m-j 個字元必須是模式串的字尾
  • 解釋完畢
  • F ( x ) + G ( x ) = x G ( x ) + 1 F(x)+G(x)=xG(x)+1 兩邊同時求導
  • F ( x ) + G ( x ) = x G ( x ) + G ( x ) F'(x)+G'(x)=xG'(x)+G(x)