我:“woc。。。AC自动机?”

我:“可以自动AC???”

然鹅。。。

大佬:“傻。。。”

我:“(⊙_⊙)?”

大佬:“缺。。。”

我:“。。。。。。”

(大佬。。。卒 | 逃。。。)

emm。。。好吧。。。让我们来看看AC自动机是啥。。。

写在前面:如果没有学过 KMP 和 Trie树,请先理解这两个算法。。。

这个东西因为是一个歪果仁发明,然后两个单词的首字母为AC,所以就被叫做AC自动机了。。。

这个东西简单来说 AC自动机 == Trie + KMP

我们需要维护的东西也很简单,类似于Trie树上的KMP中的next数组。。。(作用类似,代表意义不同)

在AC自动机中有一个 fail 叫做失配指针。。。就是用它来进行跳转进行匹配

这样我们就可以发现。。。

Trie树维护多个字符串的功能 + KMP判子串的功能 == AC自动机匹配多个字符串

emm。。。讲解原理比较麻烦,直接看代码和注释比较好懂,当然建议根据大体的原理先瞎搞一波再看

呆码:

#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
using namespace std; struct asd{
int fail; // 失配指针
int vis[]; // 子节点的位置
int end; // 标记有几个单词以这个节点结尾
} AC[];
int rt,cnt,l,n;
char ch[]; inline void build(char *ch)
{
int l=strlen(ch+);
int now=rt,v;
for(int i=;i<=l;i++)
{
v=ch[i]-'a';
if(!AC[now].vis[v]) AC[now].vis[v]=++cnt;
now=AC[now].vis[v];
}
AC[now].end+=;
} inline void get_fail()
{
queue <int> Q;
for(int i=;i<=;i++) // 第一层肯定没有之前的点与他匹配
if(AC[rt].vis[i])
Q.push(AC[rt].vis[i]); // 因为默认是 0 所以没有写指向根节点
while(!Q.empty())
{
int u=Q.front(); Q.pop();
for(int i=;i<=;i++) // 枚举所有子节点
{
if(AC[u].vis[i]) // 存在这个子节点
{
AC[AC[u].vis[i]].fail=AC[AC[u].fail].vis[i];
// 子节点的fail指针指向当前节点的
// fail指针所指向的节点的相同子节点
Q.push(AC[u].vis[i]);
}
else //不存在这个子节点
AC[u].vis[i]=AC[AC[u].fail].vis[i];
// 当前节点的这个子节点指向当
// 前节点fail指针的这个子节点
}
}
} inline int query(char *ch)
{
int l=strlen(ch+);
int now=rt,ans=,u;
for(int i=;i<=l;i++)
{
u=ch[i]-'a';
now=AC[now].vis[u];
for(int j=now; j && AC[j].end!=-; j=AC[j].fail)
{
ans+=AC[j].end;
AC[j].end=-;
}
}
return ans;
} int main()
{
cin>>n;
for(int i=;i<=n;i++)
{
scanf("%s",ch+);
build(ch);
}
get_fail();
scanf("%s",ch+);
printf("%d\n",query(ch));
return ;
}

带注释

【模板】AC自动机(简单版)的更多相关文章

  1. [模板][P3808]AC自动机(简单版)

    Description: 求n个模式串中有几个在文本串中出现 Solution: 模板,详见代码: #include<bits/stdc++.h> using namespace std; ...

  2. luoguP3808[模板]AC自动机(简单版)

    传送门 ac自动机模板题,裸的多串匹配 代码: #include<cstdio> #include<iostream> #include<algorithm> #i ...

  3. 洛谷.3808/3796.[模板]AC自动机

    题目链接:简单版,增强版 简单版: #include <cstdio> #include <cstring> const int N=1e6+5,S=26; char s[N] ...

  4. POJ 1625 Censored!(AC自动机->指针版+DP+大数)题解

    题目:给你n个字母,p个模式串,要你写一个长度为m的串,要求这个串不能包含模式串,问你这样的串最多能写几个 思路:dp+AC自动机应该能看出来,万万没想到这题还要加大数...orz 状态转移方程dp[ ...

  5. luoguP3796[模板]AC自动机(加强版)

    传送门 ac自动机模板,可能我写的ac自动机是有点问题的,所以跑的有些慢 暴力跳fail统计 代码: #include<cstdio> #include<iostream> # ...

  6. Ring HDU - 2296 AC自动机+简单DP和恶心的方案输出

    题意: 就是现在给出m个串,每个串都有一个权值,现在你要找到一个长度不超过n的字符串, 其中之前的m个串每出现一次就算一次那个字符串的权值, 求能找到的最大权值的字符串,如果存在多个解,输出最短的字典 ...

  7. 算法模板——AC自动机

    实现功能——输入N,M,提供一个共计N个单词的词典,然后在最后输入的M个字符串中进行多串匹配(关于AC自动机算法,此处不再赘述,详见:Aho-Corasick 多模式匹配算法.AC自动机详解.考虑到有 ...

  8. 模板 AC自动机

    题目描述 有$N$ 个由小写字母组成的模式串以及一个文本串$T$ .每个模式串可能会在文本串中出现多次.你需要找出哪些模式串在文本串$T$ 中出现的次数最多. 输入输出格式 输入格式: 输入含多组数据 ...

  9. 算法竞赛模板 AC自动机

    AC自动机基本操作 (1) 在AC自动机中,我们首先将每一个模式串插入到Trie树中去,建立一棵Trie树,然后构建fail指针. (2) fail指针,是穿插在Trie树中各个结点之间的指针,顾名思 ...

  10. 小明系列故事――女友的考验 HDU - 4511 AC自动机+简单DP

    题意:自己看题目,中文体面. 题解: 把所有不能走的路径放入AC自动机中. 然后DP[i][j]表示走到 i 这个点,且位于AC自动机 j 这个节点最短距离 然后直接DP即可.注意一点会爆int #i ...

随机推荐

  1. spring ----> aop测试需要的Maven依赖/测试时发生的一个exception

    <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> &l ...

  2. LeetCode--012--整数转罗马数字(java)

    罗马数字包含以下七种字符: I, V, X, L,C,D 和 M. 字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M 1000 例如, 罗马数字 2 写做 II ,即为两个并 ...

  3. 文件上传MultipartBody使用方法

    最近有使用一个文件上传的功能,需要在请求中添加文件,一起传给服务器 Okhttp提供了这个文件添加然后上传的功能 下面给出核心的代码,然后分析一下 //多个文件上传,Filelist private ...

  4. 2. 搭建DRF项目

    企业项目开发流程 一.需求分析 1.企业的web项目类型: 商城 门户网站[企业站和门户站] 社交网络 资讯论坛 内部系统 个人博客 内容收费站 前端的静态页面制作,外界开发的时候,是照着psd/pn ...

  5. 使用org.apache.poi导出Excel表格

    public HSSFWorkbook MakeExcel(List<TransactionLogVO> logList) { // SimpleDateFormat sdf = new ...

  6. Parse error: syntax error, unexpected end of file in * 的解决办法

    这个原因很简单,就是你的php语法错误. 在你的php代码种出现了<?  ?>  标准的是<?php ?>

  7. 成功解决You are using pip version 9.0.1, however version 9.0.3 is available. You should consider upgra

    解决问题 You are using pip version 9.0.3, however version 10.0.1 is available.You should consider upgrad ...

  8. Leetcode 98

    /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode ...

  9. Oracle 11.2.0.4.0 Dataguard部署和日常维护(6)-Active Dataguard篇

    1. 检查主备库的状态 on primary column DATABASE_ROLE format a20 column OPEN_MODE format a15 column PROTECTION ...

  10. postman系列之批量执行接口测试用例

    postman如何批量执行接口测试用例~其实很简单,但是会给我们的工作带来很多方便~ 比如我们写了几十个测试用例,请求都是同一个服务器IP,一旦服务器IP地址从测试环境搬到线上环境,需要修改所有的服务 ...