MZ hdu 2243 AC自動機 矩陣加速

2021-09-30 10:26:35 字數 995 閱讀 6613

給你 n 個病毒,問長度為 [1, m] 的,包括病毒的有多少。全都是小寫字母。

和 poj 2778 有點像。不一樣的是:

1)  這個是求包括的,我這麼做的,加一維用來表示已經包括了病毒的狀態。

2)  求長度是 [1, m] 的。在矩陣裡面維度變成二倍。

[a 1]

[1 0] 左下面的 1 就是最後所求。a是矩陣的話,就把 1 變成 i 矩陣, 把 0 變成 零矩陣。

這裡建立好的轉移矩陣左下面的是 i 矩陣, 所以ans矩陣初始化的時候不是 i 矩陣,而是轉移矩陣。

如果把 ans 矩陣初始化為大 i 矩陣,那麼矩陣乘 (m+1) 次就好了。

const int nn = 33;

const int kind = 26;

int cnt;//狀態數,矩陣大小

char ch[9];

int fail[nn];//每個狀態的fail指標

int child[nn][kind];//01兩種

int end[nn];//每個狀態是否已經包含一整個病毒

ll dp[nn][nn];//轉移矩陣

struct tri;

int newnode() else }}

}void init_dp()

for(int j = 0; j < kind; ++j)

}dp[cnt+1][cnt+1] = 26;

++cnt;

}tri mul(tri x, tri y)}}

return z;

}ll solve(int m)

}cnt = cnt * 2 + 1;

while(m)

ll res = ans.a[cnt/2+1][cnt/2];

return res;

}int main()

build_fail(root);

init_dp();

ll res = solve(m);

cout<

hdu 2243 AC自動機 矩陣加速

給你 n 個病毒,問長度為 1,m 的,包括病毒的有多少。全都是小寫字母。和 poj 2778 有點像。不一樣的是 1 這個是求包括的,我這麼做的,加一維用來表示已經包括了病毒的狀態。2 求長度是 1,m 的。在矩陣裡面維度變成二倍。a 1 1 0 左下面的 1 就是最後所求。a是矩陣的話,就把 1...

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

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

HDOJ 2243 AC自動機 等比矩陣求和

題目是要說小於l長度的由小寫字母組成的字串有多少個包含所給的串.從正方向想.要求出包含的.並且還要踢去重複包含的.又要加上被多踢的.整個一容斥問題了.但這題明顯是不可行的.那麼換個角度.先求出總共小於l的單詞數 26 1 26 2 26 3 26 l 然後再減去不包括所給字串的單詞.相當於把每個單詞...