hdu 2222 Keywords Search (AC自动机-初步-很理解!)
2012-09-07 13:55
169 查看
// 看北大课件学习 或者 去我百度空间有资料出处
#include <iostream> #include <cstdio> #include <cstring> #include <cstdlib> #include <string> #include <queue> #include <algorithm> #define BUG cout << "here\n"; using namespace std; #define kind 26 #define M 1000010 struct node { node* fail; node* next[kind]; int tail; node() { fail = NULL; tail = 0; memset(next, 0, sizeof(next)); } }; char ch[M]; char word[M]; queue<node*> Q; int n, m; void Insert(node* root, char *str) { node* p = root; int i = 0, index; int len = strlen(str); for(i = 0; i < len; i++) { index = str[i] - 'a'; if(p->next[index] == NULL) { p->next[index] = new node(); } p = p->next[index]; } p->tail++; } void BFS_AC(node*& root) { // 指针引用, 就是广搜模式建立失败指针, 核心 : 当前节点父节点失败指针的儿子 Q.push(root); while(!Q.empty()) { node* p = NULL; node* t = Q.front(); Q.pop(); for(int i = 0; i < kind; i++) { if(t->next[i]) { p = t->fail; while(p) { if(p->next[i]) { t->next[i]->fail = p->next[i]; break; } p = p->fail; } if(!p) { t->next[i]->fail = root; } Q.push(t->next[i]); } } } } void Query(node* root, char *str) { int i = 0, index, cnt = 0; node *p = root, *tmp; int len = strlen(str); for(i = 0; i < len; i++) { index = str[i] - 'a'; while(!p->next[index] && p != root) { p = p->fail; } p = p->next[index]; if(!p) p = root; // 标志了! tmp = p; while(tmp != root && tmp->tail != -1) { cnt += tmp->tail; tmp->tail = -1; tmp = tmp->fail; } } cout << cnt << endl; } int main() { int T; cin >> T; while(T--) { scanf("%d", &n); node* root = new node(); for(int i = 0; i < n; i++) { scanf("%s", ch); Insert(root, ch); } BFS_AC(root); scanf("%s", word); Query(root, word); } return 0; }
相关文章推荐
- 【AC自动机】HDU 2222 Keywords Search 裸题
- 【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自动机]
- HDU 2222 Keywords Search 【AC自动机(模板题)】
- HDU 2222 Keywords Search ---AC自动机
- HDU - 2222 Keywords Search(AC自动机=KMP+字典树)
- 【模板练习——AC自动机】Keywords Search HDU - 2222
- HDU 2222-Keywords Search-AC自动机模版题
- hdu_2222_Keywords Search(AC自动机板子)
- HDU-2222 Keywords Search 字符串问题 AC自动机
- HDU 2222 Keywords Search [AC自动机]