BZOJ - 2553 :禁忌(AC自動機+貪心+奇怪的矩陣)
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使用對方的每一個魔法的概率是均等的,那麽每一次隨機使用魔法所受到的禁忌傷害的期望值是多少。
Input
第一行包含三個正整數N、len、alphabet。
接下來N行,每行包含一個串Ti,表示禁忌串。
Output
一個非負實數,表示所受到禁忌傷害的期望值。
Sample Input 2 4 2 aa abbSample Output
0.75
【樣例1解釋】 一共有2^4 = 16種不同的魔法。 需要註意的是“aabb”的禁忌傷害是1而不是2。Hint
100%的數據中N ≤ 5,len ≤109,1 ≤ alphabet ≤ 26。
在所有數據中,有不少於40%的數據中:N = 1
數據保證每個串Ti的長度不超過15,並且不是空串
數據保證每個Ti均僅含有前alphabet個小寫字母。
數據保證集合T中沒有相同的元素,即對任意不同的i和j,有Ti≠Tj。
題意:求得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自動機+貪心+奇怪的矩陣)