bzoj2553 禁忌 AC自動機 矩陣乘法

2021-07-09 21:03:40 字數 848 閱讀 9458

題目敘述比較煩。。一句話,在字母只有前alphabet時,給定n個串,求長度為len的串包含這些n個串的個數最大值的期望值。

觀察資料發現串的總長度<=75,所以想到ac自動機;而len大小為10^9級別,就知道肯定是在ac自動機上的矩陣乘法,這樣大致的框架就好了。

如果令a[k][x][y]表示經過k步從狀態(ac自動機的節點)x-狀態y的期望值。顯然轉移的過程是一樣的,即a[k-1]*c=a[k],那麼在ac自動機上,如果有x-y的邊,則c[x][y]+=1/alphabet。

接下來是統計答案。如果已知乙個串,則傷害顯然是貪心地不斷取得到的,即在ac自動機上得到乙個目標節點x(即=給定的某乙個串),就需要回到原點並更新答案。不妨新增乙個點t,那麼c[x][0]+=1/alphabet,c[x][t]+=1/alphabet。可以看到,最後需要求的就是經過m部從0-t的期望值。即a[m][0][t]。

注意為了避免卡精度要開long double。

ac**如下:

#include#include#include#define ld long double

#define n 105

using namespace std;

int n,m,p,now,tot,ch[n][26],h[n],fail[n]; bool flag[n]; char s[n]; struct mat;

mat times(mat x,mat y)

return z;

}mat ksm(mat x,int k)

int main()

flag[now]=1;

} int head=0,tail=0; for (i=0; iby lych

2016.2.6

bzoj 2553 禁忌 AC自動機 期望DP

先考慮乙個串a如何劃分價值最大,只需要按照所有t串在a中匹配的右端點排個序貪心去選,也就是希望我在a中匹配i個禁忌串,最靠後的右端點應該盡量靠前。在ac自動機上對應為 只要走到乙個禁忌串的終止節點,就將它劃分出一段,這裡的終止節點包括那些順著fail指標能走到終止節點的點 可以設dp i j 為在a...

BZOJ 禁忌 AC自動機 概率DP 矩陣乘

magic land 上的人們總是提起那個傳說 他們的祖先 john 在那個東方島嶼幫助 koishi 與其姐姐 satori 最終戰平。而後,koishi 恢復了讀心的能力 如今,在 john 已經成為傳說的時代,再次造訪那座島嶼的人們卻發現 koishi 遇到了新麻煩。這次她遇到了 flandr...

AC自動機 建立nlogn個AC自動機

string set queries 題意 給你3種操作,1 加入乙個串到集合中。2 刪除集合中的某乙個串 3 查詢集合中的字串在給定的字串種出現幾次。同乙個串可重複 解法 建立多個ac自動機,用二進位制分組來處理。加入給你21個串 分為 16 4 1,再新增乙個串的時候,即21 1,22 16 4...