【HDU 2222】Keywords Search
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相关推荐
- 大数加法【HDU 1002】
大数加法模板 一般的加法只要int类型的两数直接相加即可,大一点的数可以设为long long类型,而超过长整型的数则属于大数问题了,大数加法其实也比较简单,利用数组实现就可以啦: 主要思想如下: ( ...
- 【 HDU - 5093】Battle ships(匈牙利算法,二分图匹配)
题干: Dear contestant, now you are an excellent navy commander, who is responsible of a tough mission ...
- 【HDU - 1455】Sticks (dfs + 剪枝)
题干: George took sticks of the same length and cut them randomly until all parts became at most 50 un ...
- 【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 ...
- 【HDU - 4217 】Data Structure? (线段树求第k小数)
题干: Data structure is one of the basic skills for Computer Science students, which is a particular w ...
- 【HDU - 1754】I Hate It (线段树模板 单点覆盖更新+区间最大值查询)
题干: 很多学校流行一种比较的习惯.老师们很喜欢询问,从某某到某某当中,分数最高的是多少. 这让很多学生很反感. 不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写一个程序,模拟老师的询问.当 ...
- 【HDU 5765】Bonds(进制运算妙用)
[HDU 5765]Bonds(进制运算妙用) Bonds Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K ...
- 【HDU 5755】Gambler Bo(高斯消元)
[HDU 5755]Gambler Bo(高斯消元) Gambler Bo Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 131072 ...
- 【HDU 6973】Bookshop 树剖+平衡树
[HDU 6973]Bookshop 树剖+平衡树 [引言] 平衡树的题做得比较少,难得补一次神题,记录一下供以后学习. [题意] 给出一棵 nnn 个结点的树,每个结点有一个价值为 pip_ ...
最新文章
- 如何使用 Python 创建一名可操控的角色玩家
- Android system server之PackageManagerService详细分析
- linux删除位于后台的进程组,linux命令(12)-进程与作业管理
- ANTLR笔记2 - 简单语法说明
- IntelliJ IDEA 12 与 Tomcat7 配置
- 50个认知偏误:Elon Musk thinks everyone should know about
- 检测华为网络设备的常用命令
- 算数-02-史丰收算法
- windows7桌面计算机作用,win7系统虚拟桌面功能的详细教程
- java判断张三_从程序片断:student zhangsan(“张三”,“M”,22); zhangsan.id(“2005131000”);可判断id是一个()...
- springboot+vue博客项目(码神之路博客项目)
- Tomcat启动报错 More than one fragment with the name [spring_web] was found. This is not legal with relat
- git本地分支 远程分支简单操作(后续更新)
- vue+elementUl实现登录记住密码功能
- virtualbox安装ubuntu14.04不能使用3d加速的问题
- LAZARUS遍历文件夹/文件
- Spring项目配置拦截器Interceptor
- 二级c语言手机版软件下载,二级C语言下载_二级C语言APP手机最新版安装 - 风云下载...
- 程序员经常看的开源月刊《HelloGitHub》第 58 期
- java 监听配置文件_java读取系统Properties配置文件利用线程实时监控配置文件变化...
热门文章
- DB2对年份的处理Year()
- 通过程序实现文件下载更名,动态文件下载
- [转]关于flash中图片(jpg\png\gif)旋转后锯齿(模糊)问题
- ajax中异步属性,ajax中的async属性值之同步和异步及同步和异步区别
- 基于Jenkins的嵌入式软件持续集成方法
- (19)System Verilog模块设计示例
- java命令大全_Java命令行工具:javac、java、javap 的使用详解
- 26. GD32F103C8T6入门教程-CAN外设回环测试
- 计算机开始菜单运行程序在哪里,请问谁知道电脑开始菜单里运行的指令大全?...
- 旋转成分矩阵结果分析_PCA(主成分分析) 和 SVD (奇异值分解)