20200612AC自動機 簡單版 模板

2021-10-07 03:45:28 字數 1386 閱讀 9517

題目描述

給定n個模式串和1個文字串,求有多少個模式串在文字串裡出現過。

輸入格式

第一行乙個n,表示模式串個數;

下面n行每行乙個模式串;

下面一行乙個文字串。

輸出格式

乙個數表示答案

輸入輸出樣例

輸入 #12a

aaaa

輸出 #1

2說明/提示

subtask1[50pts]:∑length(模式串)<=106,length(文字串)<=106,n=1; subtask1[50pts]:∑length(模式串)<=106,length(文字串)<=106,n=1;

運用結構:trie樹和kmp;

思路:先建一顆trie樹,然後用bfs搜尋節點失敗建立fail指標,

---------最後再遍歷文字串統計σ

\sigma

σed[i]即可。

以下為**:qwq

#include

#define n 1005000

using namespace std;

char s[n]

,t[n]

;int tree[n][26

];int ed[n]

,fail[n]

,last[n]

;int n,tot;

void

build

(char

*s) p=tree[p]

[c];

} ed[p]++;

}void

getfail()

}while

(!q.

empty()

) q.

push

(p);

int v=fail[r]

;while

(v&&

!tree[v]

[i])v=fail[v]

; fail[p]

=tree[v]

[i];

if(ed[fail[p]

])last[p]

=fail[p]

;else last[p]

=last[fail[p]];

}}}int

search

(char

*s)}

return cnt;

}int

main()

getfail()

;scanf

("%s"

,s);

int ans=

search

(s);

printf

("%d\n"

,ans)

;return0;

}

AC自動機(簡單版)

覺得ac自動機怪簡單是怎麼回事?可能題太裸了 網上講ac自動機和tire樹講的比我好的dalao數不勝數,我就不多贅述了,權當是掛個板子吧。其實char和strlen還是挺好用的。include include include using namespace std struct tire tr 1...

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

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

AC自動機及字尾自動機

ac自動機是一種基於trie樹的演算法,其本質和kmp上的處理很相似。trie樹結構 kmp轉移思路 ac自動機組要由三個部分組成 trie樹的建立 fail指標的匹配 對ac自動機的詢問 每次建立自動機會有一次初始化 ac自動機類 struct node node結構體 struct ac voi...