AC自动机 模板
2017-09-26 23:16
309 查看
#include<iostream> #include<stdio.h> #include<string.h> #include<string> #include<algorithm> #include<queue> using namespace std; const int maxnode = 500000+5; struct trie { int sz, root, val[maxnode], next[maxnode][30], fail[maxnode]; int cnt = 0; queue<int>q; void init() { sz = root = 0; val[0] = 0; memset(next, -1, sizeof(next)); } void insert(string s) { int i, j, u = 0, len = s.size(); for (i = 0; i < len; i++) { int c = s[i] - 'a'; if (next[u][c] == -1) { sz++; val[sz] = 0; next[u][c] = sz; } u = next[u][c]; } val[u]++; } void build() { while (!q.empty()) { q.pop(); } for (int i = 0; i < 25; i++) { if (next[0][i] != -1) { fail[next[0][i]] = 0; q.push(next[0][i]); } } while (!q.empty()) { int u = q.front(); q.pop(); for (int i = 0; i < 25; i++) { if (next[u][i] != -1) { q.push(next[u][i]); int tmp = fail[u]; while (tmp&&next[tmp][i]==-1) { tmp = fail[tmp]; } tmp = next[tmp][i]; if (tmp == -1) { tmp = 0; } fail[next[u][i]] = tmp; } } } } void query(string s) { cnt = 0; int len = s.size(); int u = 0; for (int i = 0; i < len; i++) { int c = s[i] - 'a'; while (next[u][c] == -1) { u = fail[u]; if (u == 0) { if (next[u][c] != -1) u = next[u][c]; } if (u == 0) { goto end; } } u = next[u][c]; int tmp = u; while (tmp != 0) { if (val[tmp] >= 0) { cnt += val[tmp]; val[tmp] = -1; } else { break; } tmp = fail[tmp]; } end:; } } }ac; int main() { string s[4]; s[0] = "abcd"; s[1] = "abd"; s[2] = "bce"; s[3] = "cd"; ac.init(); for (int i = 0; i < 4; i++) { ac.insert(s[i]); } ac.build(); string p = "abcde"; ac.query(p); cout << ac.cnt; }
相关文章推荐
- AC自动机模板
- AC自动机 模板与简单讲解 模板题:贴瓷砖
- luogu3796【模板】AC自动机(加强版)
- hdu 2222 ac自动机模板题
- AC自动机模板先存着,还不会...
- hdu 2222 ac自动机入门题 可以做模板
- hdu 2222 AC自动机模板题
- HDU2222 AC自动机模板
- AC自动机模板
- hdu 2222 AC自动机模板题
- 【AC自动机】AC自动机模板
- 【模板】AC自动机(加强版) 洛谷3796 AC自动机
- 算法模板——AC自动机
- AC自动机模板(hdu2222)
- ac自动机模板
- AC自动机 ( 模板题啊 )——病毒侵袭持续中 ( HDU 3065 )
- AC自动机模板
- ac自动机模板
- hdu 2222(AC自动机模板)
- HDOJ2222Keywords Search【AC自动机模板题】