码迷,mamicode.com
首页 > 其他好文 > 详细

AC自动机

时间:2018-11-29 15:20:10      阅读:197      评论:0      收藏:0      [点我收藏+]

标签:next   oid   print   ati   tomat   null   return   ext   const   

#include<bits/stdc++.h> using namespace std; const int maxn = 1e7 + 5; const int MAX = 10000000; int cnt; struct node { node *next[26]; node *fail; int sum; }; node *root; char key[70]; node *q[MAX]; int head,tail; node *newnode; char pattern[maxn]; int N; void Insert(char *s) { node *p = root; for(int i = 0; s[i]; i++) { int x = s[i] - ‘a‘; if(p->next[x] == NULL) { newnode=(struct node *)malloc(sizeof(struct node)); for(int j=0;j<26;j++) newnode->next[j] = 0; newnode->sum = 0;newnode->fail = 0; p->next[x]=newnode; } p = p->next[x]; } p->sum++; } void build_fail_pointer() { head = 0; tail = 1; q[head] = root; node *p; node *temp; while(head < tail) { temp = q[head++]; for(int i = 0; i <= 25; i++) { if(temp->next[i]) { if(temp == root) { temp->next[i]->fail = root; } else { p = temp->fail; while(p) { if(p->next[i]) { temp->next[i]->fail = p->next[i]; break; } p = p->fail; } if(p == NULL) temp->next[i]->fail = root; } q[tail++] = temp->next[i]; } } } } void ac_automation(char *ch) { node *p = root; int len = strlen(ch); for(int i = 0; i < len; i++) { int x = ch[i] - ‘a‘; while(!p->next[x] && p != root) p = p->fail; p = p->next[x]; if(!p) p = root; node *temp = p; while(temp != root) { if(temp->sum >= 0) { cnt += temp->sum; temp->sum = -1; } else break; temp = temp->fail; } } } int main() { int T; scanf("%d",&T); while(T--) { root=(struct node *)malloc(sizeof(struct node)); for(int j=0;j<26;j++) root->next[j] = 0; root->fail = 0; root->sum = 0; scanf("%d",&N); getchar(); for(int i = 1; i <= N; i++) { gets(key); Insert(key); } gets(pattern); cnt = 0; build_fail_pointer(); ac_automation(pattern); printf("%d\n",cnt); } return 0; }

AC自动机

标签:next   oid   print   ati   tomat   null   return   ext   const   

原文地址:http://blog.51cto.com/14093713/2323479

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!