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. 如何使用 Python 创建一名可操控的角色玩家
  2. Android system server之PackageManagerService详细分析
  3. linux删除位于后台的进程组,linux命令(12)-进程与作业管理
  4. ANTLR笔记2 - 简单语法说明
  5. IntelliJ IDEA 12 与 Tomcat7 配置
  6. 50个认知偏误:Elon Musk thinks everyone should know about
  7. 检测华为网络设备的常用命令
  8. 算数-02-史丰收算法
  9. windows7桌面计算机作用,win7系统虚拟桌面功能的详细教程
  10. java判断张三_从程序片断:student zhangsan(“张三”,“M”,22); zhangsan.id(“2005131000”);可判断id是一个()...
  11. springboot+vue博客项目(码神之路博客项目)
  12. Tomcat启动报错 More than one fragment with the name [spring_web] was found. This is not legal with relat
  13. git本地分支 远程分支简单操作(后续更新)
  14. vue+elementUl实现登录记住密码功能
  15. virtualbox安装ubuntu14.04不能使用3d加速的问题
  16. LAZARUS遍历文件夹/文件
  17. Spring项目配置拦截器Interceptor
  18. 二级c语言手机版软件下载,二级C语言下载_二级C语言APP手机最新版安装 - 风云下载...
  19. 程序员经常看的开源月刊《HelloGitHub》第 58 期
  20. java 监听配置文件_java读取系统Properties配置文件利用线程实时监控配置文件变化...

热门文章

  1. DB2对年份的处理Year()
  2. 通过程序实现文件下载更名,动态文件下载
  3. [转]关于flash中图片(jpg\png\gif)旋转后锯齿(模糊)问题
  4. ajax中异步属性,ajax中的async属性值之同步和异步及同步和异步区别
  5. 基于Jenkins的嵌入式软件持续集成方法
  6. (19)System Verilog模块设计示例
  7. java命令大全_Java命令行工具:javac、java、javap 的使用详解
  8. 26. GD32F103C8T6入门教程-CAN外设回环测试
  9. 计算机开始菜单运行程序在哪里,请问谁知道电脑开始菜单里运行的指令大全?...
  10. 旋转成分矩阵结果分析_PCA(主成分分析) 和 SVD (奇异值分解)