1. 程式人生 > >BZOJ - 2553 :禁忌(AC自動機+貪心+奇怪的矩陣)

BZOJ - 2553 :禁忌(AC自動機+貪心+奇怪的矩陣)

clas 優化 級別 方式 的人 註意 表示 family 沒有

Magic Land上的人們總是提起那個傳說:他們的祖先John在那個東方島嶼幫助Koishi與其姐姐Satori最終戰平。而後,Koishi恢復了讀心的能力……

如今,在John已經成為傳說的時代,再次造訪那座島嶼的人們卻發現Koishi遇到了新麻煩。

這次她遇到了Flandre Scarlet——她擁有可以使用禁忌魔法而不會受到傷害的能力。

為了說明什麽是禁忌魔法及其傷害,引入以下概念:

1.字母集A上的每個非空字符串對應了一個魔法。

其中A是包含了前alphabet個小寫字母的集合。

2.有一個集合T,包含了N個字母集A上的字符串

T中的每一串稱為一個禁忌串(Taboo string

3.一個魔法,或等價地,其對應的串s因為包含禁忌而對使用者造成的傷害按以下方式確定:

s分割成若幹段,考慮其中是禁忌串的段的數目,不同的分割可能會有不同的數目,其最大值就是這個傷害。

由於擁有了讀心的能力,Koishi總是隨機地使用Flandre Scarlet的魔法,可以確定的是,她的魔法正好對應字母集A上所有長度為len的串

但是,Flandre Scarlet所使用的一些魔法是帶有禁忌的,由於其自身特性,她可以使用禁忌魔法而不受到傷害,而Koishi

就不同了。可憐的Koishi每一次使用對方的魔法都面臨著受到禁忌傷害的威脅。

你現在需要計算的是如果Koishi使用對方的每一個魔法的概率是均等的,那麽每一次隨機使用魔法所受到的禁忌傷害的期望值是多少。

Input

第一行包含三個正整數Nlenalphabet

接下來N行,每行包含一個串Ti,表示禁忌串。

Output

一個非負實數,表示所受到禁忌傷害的期望值。

Sample Input 2 4 2 aa abb

Sample Output

0.75

【樣例1解釋】 一共有2^4 = 16種不同的魔法。 需要註意的是“aabb”的禁忌傷害是1而不是2。Hint

100%的數據中N ≤ 5len ≤1091 ≤ alphabet ≤ 26

在所有數據中,有不少於40%的數據中:N = 1

數據保證每個串Ti的長度不超過15,並且不是空串

數據保證每個Ti均僅含有前alphabet個小寫字母。

數據保證集合T中沒有相同的元素,即對任意不同的ij,有TiTj

題意:求得N個模板串,求長度為L的字符串,其禁忌傷害期望值,一個串的禁忌傷害為字串劃分中含模板串數列最多的那個數量。

思路:對於一個串S,把S裏所含的模板串看成線段,那麽禁忌傷害就是最多的不交叉的線段數量,顯然貪心,右端點越找結束越好,那麽End節點後面的節點其實沒有意義,可以刪去;同時,在AC自動機上面跑的時候,遇到End節點就返回根節點,這樣右端點結束,滿足貪心策略,同時期望加‘1’。

Len是1e9級別,顯然需要矩陣優化,上午做了一個取max的矩陣。 但是這裏 怎麽處理呢???

因為不好統計,同時有概率和期望值。處理方式為:i,j<=cnt時,mp[i][j]表示i到j的概率,新增加一個節點cnt+1,mp[i][cnt+1]表示的是最大期望值。

mp[cnt+1][cnt+1],這樣答案就會一直累加最大值。 輸出mp[0][cnt+1]。(對我來說不好想)。

(還是有些疑惑,等我搞清楚了再來寫吧。

BZOJ - 2553 :禁忌(AC自動機+貪心+奇怪的矩陣)