AC自动机模板 hdu2222
来源:互联网 发布:java 图片文字合成 编辑:程序博客网 时间:2024/06/08 19:43
题目大意:
给你很多个单词,然后给你一篇文章,问给出的单词在文章中出现的次数。
#include<iostream>#include<cstdio>#include<cstring>#include<string>using namespace std;#define N 500010char str[1000010], keyword[51];int head, tail;struct node{ node *fail; node *next[26]; int count; node() //init { fail = NULL; count = 0; for(int i = 0; i < 26; ++i) next[i] = NULL; }}*q[N];node *root;void insert(char *str) //建立Trie{ int temp, len; node *p = root; len = strlen(str); for(int i = 0; i < len; ++i) { temp = str[i] - 'a'; if(p->next[temp] == NULL) p->next[temp] = new node(); p = p->next[temp]; } p->count++;}void build_ac() //初始化fail指针,BFS{ q[tail++] = root; while(head != tail) { node *p = q[head++]; //弹出队头 node *temp = NULL; for(int i = 0; i < 26; ++i) { if(p->next[i] != NULL) { if(p == root) //第一个元素fail必指向根 p->next[i]->fail = root; else { temp = p->fail; //失败指针 while(temp != NULL) //2种情况结束:匹配为空or找到匹配 { if(temp->next[i] != NULL) //找到匹配 { p->next[i]->fail = temp->next[i]; break; } temp = temp->fail; } if(temp == NULL) //为空则从头匹配 p->next[i]->fail = root; } q[tail++] = p->next[i]; //入队 } } }}int query() //扫描{ int index, len, result; node *p = root; //Tire入口 result = 0; len = strlen(str); for(int i = 0; i < len; ++i) { index = str[i] - 'a'; while(p->next[index] == NULL && p != root) //跳转失败指针 p = p->fail; p = p->next[index]; if(p == NULL) p = root; node *temp = p; //p不动,temp计算后缀串 while(temp != root && temp->count != -1) { result += temp->count; temp->count = -1; temp = temp->fail; } } return result;}int main(){ int ncase, num; scanf("%d", &ncase); while(ncase--) { head= tail = 0; root = new node(); scanf("%d", &num); getchar(); for(int i = 0; i < num; ++i) { gets(keyword); insert(keyword); } build_ac(); scanf("%s", str); printf("%d\n", query()); } return 0;}
0 0
- AC自动机模板 hdu2222
- hdu2222 ac自动机模板
- HDU2222 AC自动机模板
- AC自动机模板 hdu2222
- hdu2222 ac自动机模板
- ac自动机模板hdu2222
- hdu2222 ac自动机模板题
- AC自动机模板(hdu2222)
- ac自动机模板(hdu2222)
- ac自动机模板(hdu2222)
- HDU2222 AC自动机 入门模板
- hdu2222 AC自动机入门 指针型模板
- AC自动机模板(数组+指针)hdu2222
- HDU2222 Keywords Search AC自动机模板题
- HDU2222 Keywords Search(AC自动机模板题)
- hdu2222--Keywords Search+AC自动机模板
- hdu2222&hdu3065 AC自动机模板题
- HDU2222 Keywords Search [AC自动机模板]
- 洛谷日记4
- java几种常见的数据库连接
- 第十 selinux的管理
- css选择器
- 输出素数
- AC自动机模板 hdu2222
- hdu 5546 Ancient Go(dfs)
- C/C++关键字(1)
- Large Division
- Git常见错误解决方法
- vue基础一
- 高效开发使用框架请求https(xutils3 Nohttp,OkhttpUtils(zhy))
- 泛型
- JAVA 对象存放的位置