为了一言不合就徒手敲AC自动机,决定看一下原理

于是花了一张图,

参考HDU2222的样例

于是看懂这张图的你很快就敲出了如下代码并且AC了

#include<bits/stdc++.h>
#define rep(i,j,k) for(int i=j;i<=k;i++)
#define rrep(i,j,k) for(int i=j;i>=k;i--)
#define println(a) printf("%lld\n",(ll)(a))
#define printbk(a) printf("%lld ",(ll)(a))
typedef long long ll;
using namespace std;
const int MAXN = 2e6+11;
const ll oo = 0x3f3f3f3f3f3f3f3f;
const ll ooo= 0x3f3f3f3f;
ll read(){
ll x=0,f=1;register char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
struct AHO{
int cnt[MAXN];
int fail[MAXN];
int son[MAXN][26];
int tot,root;
void init(){
tot=root=1;
cnt[root]=fail[root]=0;
rep(i,0,25) son[root][i]=0;
}
int node(){
++tot;
cnt[tot]=fail[tot]=0;
rep(i,0,25) son[tot][i]=0;
return tot;
}
void insert(char *str){
int o=root;
int len=strlen(str+1);
rep(i,1,len){
int c=str[i]-'a';
if(son[o][c]==0){
son[o][c]=node();
}
o=son[o][c];
}
cnt[o]++;
}
void build(){
queue<int> que;
que.push(root);
while(!que.empty()){
int o=que.front();
que.pop();
rep(i,0,25){
if(!son[o][i]) continue;
if(o==root) fail[son[o][i]]=root;
else{
int t=fail[o];
while(t){
if(son[t][i]){// if exists
fail[son[o][i]]=son[t][i];
break;
}
t=fail[t];
}
if(t==0) fail[son[o][i]]=root;
}
que.push(son[o][i]);
}
}
}
int query(char *str){
int len=strlen(str+1);
int o=root;
int res=0;
rep(i,1,len){
int c=str[i]-'a';
while(son[o][c]==0&&o!=root) o=fail[o];
o=son[o][c];
if(o==0) o=root;
int t=o;
while(t!=root){
if(cnt[t]>=0){
res+=cnt[t];
cnt[t]=-1;
}else break;
t=fail[t];
}
}
return res;
}
}aho;
char str[MAXN];
int main(){
int T=read();
while(T--){
aho.init();
int n=read();
rep(i,1,n){
scanf("%s",str+1);
aho.insert(str);
}
aho.build();
scanf("%s",str+1);
println(aho.query(str));
}
return 0;
}

[意识流]简单易懂的AC自动机的更多相关文章

  1. 基于trie树做一个ac自动机

    基于trie树做一个ac自动机 #!/usr/bin/python # -*- coding: utf-8 -*- class Node: def __init__(self): self.value ...

  2. AC自动机-算法详解

    What's Aho-Corasick automaton? 一种多模式串匹配算法,该算法在1975年产生于贝尔实验室,是著名的多模式匹配算法之一. 简单的说,KMP用来在一篇文章中匹配一个模式串:但 ...

  3. python爬虫学习(11) —— 也写个AC自动机

    0. 写在前面 本文记录了一个AC自动机的诞生! 之前看过有人用C++写过AC自动机,也有用C#写的,还有一个用nodejs写的.. C# 逆袭--自制日刷千题的AC自动机攻克HDU OJ HDU 自 ...

  4. BZOJ 2434: [Noi2011]阿狸的打字机 [AC自动机 Fail树 树状数组 DFS序]

    2434: [Noi2011]阿狸的打字机 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 2545  Solved: 1419[Submit][Sta ...

  5. BZOJ 3172: [Tjoi2013]单词 [AC自动机 Fail树]

    3172: [Tjoi2013]单词 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 3198  Solved: 1532[Submit][Status ...

  6. BZOJ 1212: [HNOI2004]L语言 [AC自动机 DP]

    1212: [HNOI2004]L语言 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1367  Solved: 598[Submit][Status ...

  7. [AC自动机]【学习笔记】

    Keywords Search Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)To ...

  8. AC自动机 HDU 3065

    大概就是裸的AC自动机了 #include<stdio.h> #include<algorithm> #include<string.h> #include< ...

  9. AC自动机 HDU 2896

    n个字串 m个母串 字串在母串中出现几次 #include<stdio.h> #include<algorithm> #include<string.h> #inc ...

随机推荐

  1. 统计学中z分布、t分布、F分布及χ^2分布

    Z就是正态分布,X^2分布是一个正态分布的平方,t分布是一个正态分布除以(一个X^2分布除以它的自由度然后开根号),F分布是两个卡方分布分布除以他们各自的自由度再相除 比如X是一个Z分布,Y(n)=X ...

  2. java如何集成支付宝移动快捷支付功能

    项目需要,需要在客户端集成支付宝接口.第一次集成,过程还是挺简单的,不过由于支付宝官方文档写的不够清晰,也是走了一些弯路,下面把过程写出来分享给大家.就研究了一下:因为使用支付宝接口,就需要到支付宝官 ...

  3. UVa 1153 Keep the Customer Satisfied (贪心+优先队列)

    题意:给定 n 个工作,已知每个工作要用的时间 q 和 截止时间 d,问你最多完成多少个工作,每次最多能运行一个工作. 析:这个题是贪心,应该能看出来,关键是贪心策略是什么,这样想,先按截止时间排序, ...

  4. jmeter 性能分析 (一点点加)

    1.聚合报告 我们可以看到,通过这份报告我们就可以得到通常意义上性能测试所最关心的几个结果了. Samples -- 本次场景中一共完成了多少个Transaction Average -- 平均响应时 ...

  5. [转]构建基于WCF Restful Service的服务

    本文转自:http://www.cnblogs.com/scy251147/p/3566638.html 前言 传统的Asmx服务,由于遵循SOAP协议,所以返回内容以xml方式组织.并且客户端需要添 ...

  6. [label][PHP-Security]PHP Security Program

    本文是通过阅读http://www.nowamagic.net/中的PHP安全变成专题,同时结合个人的一点点开发经验组合而成的. 如果你需要看原文,可以直接访问http://www.nowamagic ...

  7. Lucene教程(四) 索引的更新和删除

    这篇文章是基于上一篇文章来写的,使用的是IndexUtil类,下面的例子不在贴出整个类的内容,只贴出具体的方法内容. 3.5版本: 先写了一个check()方法来查看索引文件的变化:   /**   ...

  8. nancyfx中的静态内容文件夹

    原文件 DefaultStaticContentsConventions.cs 可以根据需要自定调整,在代码里改的好处是通用.如果通过在webconfig里设置的话,在非iis环境下,可能会有问题. ...

  9. 在Excel中导入文本文件(CSV/TXT),自定义隔离符号

    经常需要在Excel中导入文本文件,但是需要自定义隔离符号,例如空格或者逗号,参考一下方法:

  10. .Net 使用HighCharts 导入图片到Excel

    需求:数据统计报表使用到HighCharts显示各种图形:柱状图,饼图,点阵图等等,需要将数据表以及对应的图像导入到Excel中,方便打印. 解决方法: Excel导出采用NPOI,HighChart ...