AC自動機 + 矩陣優化 --- [BJOI2017]魔法咒語
bzoj 4860 LOJ2180 洛谷P3175
[BJOI2017]魔法咒語
題目描述:
Chandra 是一個魔法天才。
從一歲時接受火之教會洗禮之後,Chandra 就顯示出對火元素無與倫比的親和力,輕而易舉地學會種種晦澀難解的法術。
這也多虧 Chandra 有著常人難以企及的語言天賦,讓她能輕松流利地說出咒語中那些極其拗口的魔法詞匯。
直到十四歲,開始學習威力強大的禁咒法術時,Chandra 才遇到了障礙。
根據火之魔法規則,禁咒的構成單位是 N 個基本詞匯。
施法時只要凝聚精神力,說出一段用這些詞語組成的長度恰好等於 L 的語言,就能釋放威力超乎想象的火法術。
過去的魔法師們總結了幾種表達起來最連貫的組合方式,方便施法者以最快語速完成法術。
但具有魔法和語言雙重天才的 Chandra 不滿足於這幾種流傳下來的禁咒,因為她可以毫無困難地說出普通人幾乎不可能表達的禁咒語句。
然而,在實際施法時,Chandra 發現有些自創禁咒念出後不但沒有預期效果,反而會使自己的精神力迅速枯竭,十分難受。
這個問題令 Chandra 萬分不解。
她大量閱讀典籍,到處走訪魔法學者,並且不顧精神折磨一次又一次嘗試新咒語,希望找出問題的答案。
很多年過去了,在一次遠古遺跡探險中,Chandra 意外闖進了火之神艾利克斯的不知名神殿。
根據巖土特征分析,神殿應該有上萬年的歷史,這是極其罕見的。Chandra 小心
翼翼地四處探索,沿著魔力流動來到一間密室。她看見密室中央懸浮著一本書籍。
在魔法保護下書籍狀況完好。精通上古語言的 Chandra 讀過此書,終於解開了多年的困惑。
禁咒法術之所以威力強大,是因為咒語借用了火之神艾利克斯的神力。
這本書裏記載了艾利克斯生平忌諱的 M 個詞語,比如情敵的名字、討厭的植物等等。
使用禁咒法術時,如果語言中含有任何忌諱詞語,就會觸怒神力而失效,施法者也一並遭受懲罰。
例如,若 ”banana” 是唯一的忌諱詞語,“an”、”ban”、”analysis” 是基本詞匯,
禁咒長度須是 11,則“bananalysis” 是無效法術,”analysisban”、”anbanbanban”是兩個有效法術。
註意:一個基本詞匯在禁咒法術中可以出現零次、一次或多次;
只要組成方式不同就認為是不同的禁咒法術,即使書寫形式相同。
謎題破解,Chandra 心情大好。
她決定計算一共有多少種有效的禁咒法術。
由於答案可能很大,你只需要輸出答案模 1,000,000,007 的結果。
輸入格式:
第一行,三個正整數 N, M, L。
接下來 N 行,每行一個只含小寫英文字母的字符串,表示一個基本詞匯。
接下來 M 行,每行一個只含小寫英文字母的字符串,表示一個忌諱詞語。
輸出格式
僅一行,一個整數,表示答案(模 \(10^{9}+7\))。
數據範圍:
對於 100%的數據,1 ≤ N, M ≤ 50,1 ≤ L ≤ \(10^{8}\),基本詞匯的長度之和不超過100,忌諱詞語的長度之和不超過 100。
保證基本詞匯不重復,忌諱詞語不重復。
AC自動機題感覺都是套路(3min秒掉好開心)
統計單詞是不是?
先來個dp狀態:\(dp(i,j)\)表示構造到第i位,再AC自動機上狀態為j的方案數
AC自動機哪裏來?
禁忌單詞是不是?不能碰到是不是?AC自動機肯定就是你了。
限定單詞?
好像不好處理,但是也沒有什麽。
原本常用dp:
\(dp(i,j)= \sum_{trans(v,c) = j} dp(i - 1,v)\)
稍微改一下:
\(dp(i,j) = \sum_{trans(v,words)} dp(i - len(words),v) \)
words就是題面中給出的構成單詞。
好像解決了???
並沒有,對於60%的數據點,dp是可以解決的。
但是對於後面的點,L過大, 但是\(len(words)\)並不大,可以考慮矩陣優化
最後20分的點怎麽辦???
把狀態抽象出來:
\(dp(i,...)= \sum dp(i-1,...) + \sum(dp(i-2,...) )\)
還是個線性遞推式,依然可以用矩陣轉移。
最終前60%數據的復雜度:O(\(L* \sum len(words)\))
後40%數據的復雜度:O(\( \sum (2 * len(words))) ^ {3} * \log L\))
代碼請等實現
AC自動機 + 矩陣優化 --- [BJOI2017]魔法咒語