HDU 2222 Keywords Search 【AC自动机模板】
2013-08-06 10:30
513 查看
询问有多少个模式串出现在了文本串里面。将模式串插入Trie树中,然后跑一边AC自动机统计一下就哦了。
献上一份模板。
献上一份模板。
#include <cstdio> #include <algorithm> #include <iostream> #include <queue> #include <cstring> using namespace std; int cnt; struct AC_Automata { #define N 240005 #define M 26 int ch [M], sz; int val , last , f , cc ; void clear() { sz = 1; memset(ch[0], 0, sizeof(ch[0])); } int idx(char c) { return c-'a'; } void insert(char s[], int v) { int u = 0; for (int i=0; s[i]; i++) { int c = idx(s[i]); if (!ch[u][c]) { memset(ch[sz], 0, sizeof(ch[sz])); val[sz] = cc[sz] = 0; ch[u][c] = sz++; } u = ch[u][c]; } cc[u]++; val[u] = v; } void build() { queue<int> q; f[0] = 0; for (int c=0; c<M; c++) { int u = ch[0][c]; if (u) { f[u] = 0, q.push(u); last[u] = 0; } } while (!q.empty()) { int r = q.front(); q.pop(); for (int c=0; c<M; c++) { int u = ch[r][c]; if (!u) { ch[r][c] = ch[f[r]][c]; continue; } q.push(u); int v = f[r]; f[u] = ch[v][c]; last[u] = val[f[u]] ? f[u] : last[f[u]]; } } } void find(char *s) { int j = 0; for (int i=0; s[i]; i++) { int c = idx(s[i]); j = ch[j][c]; //if (val[j]) print(j); //else if (last[j]) print(last[j]); if (cc[j]) print(j); else if (last[j]) print(last[j]); } } void print(int j) { //打印以结点j结尾的所有字符串 if (j) { //printf("%d: %d\n", j, val[j]); cnt += cc[j]; cc[j] = 0; print(last[j]); } } } ac; char s[55], text[1000006]; int main() { int n, T; scanf("%d", &T); while (T--) { scanf("%d", &n); ac.clear(); for (int i=1; i<=n; i++) { scanf(" %s", s); ac.insert(s, i); } ac.build(); cnt = 0; scanf(" %s", text); ac.find(text); printf("%d\n", cnt); } return 0; }
相关文章推荐
- Keywords Search - HDU 2222(AC自动机模板)
- 【HDU-2222】Keywords Search(AC自动机模板)
- Match:Keywords Search(AC自动机模板)(HDU 2222)
- HDU 2222 Keywords Search 【AC自动机模板】
- hdu 2222 Keywords Search(AC自动机模板)
- HDU 2222 Keywords Search (AC自动机模板)
- hdu 2222:Keywords Search(AC自动机模板)
- HDU 2222 Keywords Search(AC自动机模板)
- AC自动机学习小记 Hdu 2222 Keywords Search (模板)
- HDU 2222 - Keywords Search(AC自动机模板)
- hdu -2222 Keywords Search(AC自动机模板)
- hdu 2222 Keywords Search(AC自动机模板)
- HDU 2222 Keywords Search(AC自动机模板)
- HDU 2222 Keywords Search(AC自动机 模板)
- 文章标题 HDU 2222 : Keywords Search (AC自动机模板)
- HDU-2222 Keywords Search(AC自动机--模板题)
- HDU_2222 Keywords Search 【AC自动机模板题】【动态链表】
- [AC自动机模板题] HDU 2222 Keywords Search
- 【模板练习——AC自动机】Keywords Search HDU - 2222
- HDU 2222 Keywords Search 【AC自动机(模板题)】