[意识流]简单易懂的AC自动机
为了一言不合就徒手敲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自动机的更多相关文章
- 基于trie树做一个ac自动机
基于trie树做一个ac自动机 #!/usr/bin/python # -*- coding: utf-8 -*- class Node: def __init__(self): self.value ...
- AC自动机-算法详解
What's Aho-Corasick automaton? 一种多模式串匹配算法,该算法在1975年产生于贝尔实验室,是著名的多模式匹配算法之一. 简单的说,KMP用来在一篇文章中匹配一个模式串:但 ...
- python爬虫学习(11) —— 也写个AC自动机
0. 写在前面 本文记录了一个AC自动机的诞生! 之前看过有人用C++写过AC自动机,也有用C#写的,还有一个用nodejs写的.. C# 逆袭--自制日刷千题的AC自动机攻克HDU OJ HDU 自 ...
- BZOJ 2434: [Noi2011]阿狸的打字机 [AC自动机 Fail树 树状数组 DFS序]
2434: [Noi2011]阿狸的打字机 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 2545 Solved: 1419[Submit][Sta ...
- BZOJ 3172: [Tjoi2013]单词 [AC自动机 Fail树]
3172: [Tjoi2013]单词 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 3198 Solved: 1532[Submit][Status ...
- BZOJ 1212: [HNOI2004]L语言 [AC自动机 DP]
1212: [HNOI2004]L语言 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1367 Solved: 598[Submit][Status ...
- [AC自动机]【学习笔记】
Keywords Search Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)To ...
- AC自动机 HDU 3065
大概就是裸的AC自动机了 #include<stdio.h> #include<algorithm> #include<string.h> #include< ...
- AC自动机 HDU 2896
n个字串 m个母串 字串在母串中出现几次 #include<stdio.h> #include<algorithm> #include<string.h> #inc ...
随机推荐
- DB2日期转格式化字符串
DB2 应该有个 TO_CHAR 的函数. 用来把 日期 转换为 字符串 1 2 3 4 5 6 7 8 9 10 db2 => SELECT db2 (cont.) => TO ...
- HITS
HITS 1 概述 HITS(hypertext induced topic search)超链接归纳主题搜索是由kleinbers在90年代提出的基于链接分析的网页排名算法.Hits算法是利用Hub ...
- Android-画板
在上一篇博客,Android-图像原理/绘制原理,讲解到绘图原理中,画布 + 画笔
- long polling
Regular http: client 发出请求到server server 计算 response server 响应 response 给 client Polling: A client re ...
- 搭建自己的 Docker 私有仓库服务
关于 Docker 的介绍这里就省了,Docker 在其相关领域的火爆程度不亚于今年汽车行业里的特斯拉,docCloud 甚至把公司名都改成了 Docker, Inc. 好东西总是传播很快,我们现在已 ...
- easyui - using
using 是 easyloader.load 简写 using('calendar', function() { alert("加载calendar成功 ...
- shell相关文件
站在用户登录的角度来说,SHELL的类型: 登录式shell: 正常通常某终端登录 su - USERNAME su -l USERNAME 非登录式shell: su USERNAME 图形终端下 ...
- ASP.NET RouteModule相关的一些东西
Asp.NET中的路由配置,首先要提到的几个相关类型,Route ,RouteBase,RouteData,RouteTable,RouteCollection 这几个.下面我一次回忆一下,有需要的朋 ...
- SQL Server—— 如何创建定时作业
在做SQL server 管理时,往往需要每日执行定时任务,但是如果每天都去人工执行,非常不方便,而且一般定时操作,都应该是在数据库压力不大时,一般是在夜间.所以我们需要创建定时作业来代替人工的执行定 ...
- insert into 的另一种添加插入新行方式
语法 1 插入一行 insert into table (field1,field2.....) select value1,value2........; 2 插入多行 insert into ta ...