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

  今天学习了一下Aho-Corasick Automation。以前学了trie之后就停止搞字符串这方面了,因为今年NOI出现了AC自动机,所以要学习一下。

  这个题目的代码很多,我只是贴出来纪念一下第一道AC自动机,我也是跟别人学的。希望做的题多了,我也可以形成自己的风格(这个风格就比较符合我了)……

  加油!

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <queue>
using namespace std;int n,Cases;
char pattern[51],match[1000001];
struct Aho_Corasick{struct NODE{int cnt;NODE *fail,*next[26];NODE(){fail=NULL,cnt=0;memset(next,0,sizeof(next));}}*root,*p;queue<NODE*> q;void init(){root=new NODE();}void build(){q.push(root);while(!q.empty()){NODE *cur=q.front();q.pop();for(int i=0;i<26;i++) if(cur->next[i]){for(p=cur->fail;p;p=p->fail)if(p->next[i]){cur->next[i]->fail=p->next[i];break;}if(!p) cur->next[i]->fail=root;q.push(cur->next[i]);}}}void insert(char *s){int len=strlen(s);p=root;for(int i=0;i<len;i++){if(!p->next[s[i]-'a']) p->next[s[i]-'a']=new NODE();p=p->next[s[i]-'a'];}p->cnt++;}void query(char *s){int ans=0,len=strlen(s);p=root;for(int i=0;i<len;i++){while(!p->next[s[i]-'a'] && p!=root) p=p->fail;p=p->next[s[i]-'a'];if(!p) p=root;for(NODE *j=p;j&&j->cnt!=-1;j=j->fail)ans+=j->cnt,j->cnt=-1;}printf("%d\n",ans);}
}AC;int main(){scanf("%d",&Cases);while(Cases--){scanf("%d",&n);AC.init();while(n--){scanf("%s",pattern);AC.insert(pattern);}AC.build();scanf("%s",match);AC.query(match);}return 0;
}

转载于:https://www.cnblogs.com/Delostik/archive/2011/08/11/2135516.html

【HDU 2222】Keywords Search相关推荐

  1. 大数加法【HDU 1002】

    大数加法模板 一般的加法只要int类型的两数直接相加即可,大一点的数可以设为long long类型,而超过长整型的数则属于大数问题了,大数加法其实也比较简单,利用数组实现就可以啦: 主要思想如下: ( ...

  2. 【 HDU - 5093】Battle ships(匈牙利算法,二分图匹配)

    题干: Dear contestant, now you are an excellent navy commander, who is responsible of a tough mission ...

  3. 【HDU - 1455】Sticks (dfs + 剪枝)

    题干: George took sticks of the same length and cut them randomly until all parts became at most 50 un ...

  4. 【HDU - 4006】The kth great number (优先队列,求第k大的数)

    题干: Xiao Ming and Xiao Bao are playing a simple Numbers game. In a round Xiao Ming can choose to wri ...

  5. 【HDU - 4217 】Data Structure? (线段树求第k小数)

    题干: Data structure is one of the basic skills for Computer Science students, which is a particular w ...

  6. 【HDU - 1754】I Hate It (线段树模板 单点覆盖更新+区间最大值查询)

    题干: 很多学校流行一种比较的习惯.老师们很喜欢询问,从某某到某某当中,分数最高的是多少.  这让很多学生很反感. 不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写一个程序,模拟老师的询问.当 ...

  7. 【HDU 5765】Bonds(进制运算妙用)

    [HDU 5765]Bonds(进制运算妙用) Bonds Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K ...

  8. 【HDU 5755】Gambler Bo(高斯消元)

    [HDU 5755]Gambler Bo(高斯消元) Gambler Bo Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 131072 ...

  9. 【HDU 6973】Bookshop 树剖+平衡树

    [HDU 6973]Bookshop 树剖+平衡树 [引言] ​ 平衡树的题做得比较少,难得补一次神题,记录一下供以后学习. [题意] ​ 给出一棵 nnn 个结点的树,每个结点有一个价值为 pip_ ...

最新文章

  1. 京东方剑指物联网领域
  2. oracle11g与weblogic兼容,WebLogic 10.3.6与JDK 1.7的兼容问题
  3. 硬件丨十大人工智能芯片厂商
  4. 打造高效机房就这么简单(一)
  5. Logistics回归数据集(testSet.txt)《机器学习实战》【美】Peter Harrington python3.6+pycharm完美实现代码
  6. Spring Boot 多版本更新,紧急修复 RFD 安全漏洞
  7. 毕业论文 | 基于脉冲耦合神经网络(PCNN)的图像特征提取:论文及源代码及参考文献
  8. 手把手带你入门Python爬虫(三、PyMySQL)
  9. Linux 磁盘管理--RAID1创建
  10. 六度人和张星亮:SaaS市场要回归TO B本质
  11. 五大最主流浏览器综合性能测试
  12. Pixazza把每张图片自动变成广告赚钱
  13. ADO.NET数据访问模式
  14. 通过刷bios的方式在win8.1平板上启动windows phone模拟器
  15. To prevent a memory leak, the JDBC Driver has been forcibly unregistered.异常处理
  16. 泡泡龙游戏的完整制作流程
  17. windows无法自动修复此计算机 鼠标,win10出现你的账户已被停用。开机按F8进不去。自动修复鼠标和键盘都用...
  18. qpython安装requests库_qpython3安装库的三种方法
  19. 牛逼了,用Python破解wifi密码
  20. 物联卡如何提高安全等级

热门文章

  1. Initializing Java Tooling 30% 停住不动了
  2. 温度记录仪开发_TinkerNode NBIoT物联网开发板
  3. 金税盘怎么安装在电脑上_金税盘怎么安装,电脑重装后怎样安装金税盘税控开票软件?...
  4. (25)System Verilog类外约束类内变量
  5. MRC522(2):超简易门禁
  6. oracle add datafile ora-01900,一卡通2.2维护手册
  7. 为什么叫光呆公式光_光镊力学理论简析
  8. Linux内核分析 - 网络[十二]:UDP模块 - socket
  9. uboot copy_from_nand代码详解
  10. 【STM32】HAL库 STM32CubeMX教程十五---FMC-SDRAM(一)