AC自动机模板
2012-10-29 11:04
381 查看
// 有next数组版本。。 #include<cstdio> #include<string.h> #include<math.h> #include<queue> #include<algorithm> #define N 500006 using namespace std; char st[1000005]; char keyword[55]; int n,m; int next [26],cnt ,fail ,pos; int newnode() { for(int i=0; i<26; i++) next[pos][i] = 0; fail[pos] = cnt[pos] = 0; return pos++; } void insert(char *s) //构造trie { int i,p = 0; for(i=0; s[i]; i++) { int k = s[i] - 'a', &x = next[p][k]; p = x?x : x = newnode(); } cnt[p]++; // 位运算要用 } void makenext() // 构造失败指针 { int i; queue<int>q; q.push(0); while(!q.empty()) // 这个代码为什么会这么强? { int u = q.front(); cnt[u] += cnt[fail[u]]; q.pop(); for(i=0; i<26; i++) { int v = next[u][i]; if(v == 0) next[u][i] = next[fail[u]][i]; // why? 缺少v, 求next else q.push(v); if(u && v) { fail[v]=next[fail[u]][i]; // 为什么只弄了一下? 如果没有会怎么样? 求fail } } } } int query(char *s) { int ret = 0, idx, d = 0; for(int i=0; s[i]; i++) { idx = s[i] - 'a'; d = next[d][idx]; ret += cnt[d]; cnt[d] = 0; } return ret; } int main() { int cas; scanf("%d",&cas); while(cas--) { scanf("%d",&n); pos = 0, newnode(); for(int i=0; i<n; i++) { scanf("%s",keyword); insert(keyword); } makenext(); scanf(" %s",st); printf("%d\n",query(st)); } }
相关文章推荐
- [hdu2222]ac自动机(模板)
- P3796 【模板】AC自动机(加强版)
- AC自动机模板
- 算法模板——AC自动机
- AC自动机模板
- AC自动机模板
- BZOJ 3172 [Tjoi2013] 单词 [AC自动机模板]
- HDU 2222 (AC自动机模板)
- AC自动机模板先存着,还不会...
- 【AC自动机】HDU中模板题
- hdu 2222 ac自动机入门题 可以做模板
- HDU2222【AC自动机(基础·模板)】
- hdu 2222 ac自动机模板
- hdu 2222 AC自动机模板题
- AC自动机(1)--hdu2222(基本模板)
- AC自动机初学(模板)+ HDU 2222
- 【HDU2222】【AC自动机模板 测烂为止】Keywords Search
- hdu2222 ac自动机模板
- AC自动机模板
- AC自动机模板