HDU2222 自动机(学习中)
来源:互联网 发布:如何开通淘宝直播功能 编辑:程序博客网 时间:2024/06/15 08:20
题目大意:
给你很多个单词,然后给你一篇文章,问给出的单词在文章中出现的次数。
解题思路:
AC自动机入门题。需要注意的就是可能有重复单词
代码如下:
#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
- HDU2222 自动机(学习中)
- hdu2222,(ac自动机)
- hdu2222(AC自动机)
- HDU2222(AC自动机)
- AC自动机(hdu2222)
- hdu2222(AC自动机)
- AC自动机模板(hdu2222)
- ac自动机模板(hdu2222)
- hdu2222(AC自动机基础)
- ac自动机模板(hdu2222)
- hdu2222 Keywords Search & AC自动机学习小结
- AC自动机的初步学习 hdu2222 AC自动机入门题
- hdu2222 Keywords Search (AC自动机)
- AC自动机模板(数组+指针)hdu2222
- hdu2222 Keywords Search (AC自动机)
- [HDU2222]Keywords Search(AC自动机)
- HDU2222 Keywords Search(AC自动机)
- HDU2222 多串匹配 (AC自动机)
- J2EE第一天问题汇总
- goibkeqxt
- 黑马程序员——高新技术---反射
- 一个问题 - 当你写一段代码时,你是否会考虑这份代码可能面临的各种执行环境
- 黑马程序员--多线程--5th
- HDU2222 自动机(学习中)
- Chapter 4 -- Operating System
- OJ第二批——Problem B:处理成绩(C++类训练)
- android屏幕适配dip,dpi,px,sp相关
- ELF格式文件符号表全解析及readelf命令使用方法
- 黑马程序员——变量、printf函数、scanf函数
- struts2框架学习之工程搭建、拦截器和包
- 文章标题
- 图片选择器