HDU2222 Keywords Search AC自动机

Problem Address:http://acm.hdu.edu.cn/showproblem.php?pid=2222

 

【前言】

 

AC自动机的入门题。

 

AC自动机其实是在Tire树上建造起来的。比起字典树,它只是多了一个失败指针。

 

其实它用的也是KMP的思想,也就是把KMP和Tire结合起来。

 

具体就不多说了,网上也是有很多资料的。

 

作为开始学习AC自动机的我也是抄袭了很多,放在这里也是为了方便以后做模板。

 

而AC自动机还有蛮多的变种的,还要继续好好学习。

 

【思想】

 

AC自动机最简单的应用。

 

建树—>构造失败指针—>查找。

 

这里用了静态数组建造Tire树。事实上静态数组比起动态建树还是可以节省不少时间的。

 

【代码】

 

#include <iostream> #include <cstring> using namespace std; struct node { node *fail; node *next[26]; int count; }tire[500005]; int total; node *root; char keyword[55]; char str[1000005]; node *q[500005]; int head, tail; node* new_node() { node *p = &tire[total]; total++; p->count = 0; p->fail = NULL; memset(p->next, NULL, sizeof(p->next)); return p; } void insert(node *root, char *s) { node *p = root; int i=0, index; while(s[i]!='/0') { index = s[i] - 'a'; if (p->next[index]==NULL) p->next[index] = new_node(); p = p->next[index]; i++; } p->count++; } void build_ac_automation(node *root) { int i; node *temp, *p; root->fail = NULL; head = 1; tail = 0; q[0] = root; while(head!=tail) { temp = q[tail++]; p = NULL; for (i=0; i<26; i++) { if (temp->next[i]!=NULL) { if (temp==root) temp->next[i]->fail = root; else { p = temp->fail; while(p!=NULL) { if (p->next[i]!=NULL) { temp->next[i]->fail = p->next[i]; break; } p = p->fail; } if (p==NULL) temp->next[i]->fail = root; } q[head++] = temp->next[i]; } } } } int query(node *root, char *s) { int i=0, ct=0, index, len=strlen(s); node *p = root, *temp; while(s[i]!='/0') { index = s[i] - 'a'; while(p->next[index]==NULL && p!=root) p = p->fail; p = p->next[index]; p = (p==NULL)?root:p; temp = p; while(temp!=root && temp->count!=-1) { ct += temp->count; temp->count = -1; temp = temp->fail; } i++; } return ct; } int main() { int t, n; int i; scanf("%d", &t); while(t--) { total = 0; root = new_node(); scanf("%d", &n); for (i=0; i<n; i++) { scanf("%s", keyword); insert(root, keyword); } build_ac_automation(root); scanf("%s", str); printf("%d/n", query(root, str)); } return 0; }

你可能感兴趣的:(null,search,query,insert,Build)