【模板】AC自动机(简单版)
我:“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自动机(简单版)的更多相关文章
- [模板][P3808]AC自动机(简单版)
Description: 求n个模式串中有几个在文本串中出现 Solution: 模板,详见代码: #include<bits/stdc++.h> using namespace std; ...
- luoguP3808[模板]AC自动机(简单版)
传送门 ac自动机模板题,裸的多串匹配 代码: #include<cstdio> #include<iostream> #include<algorithm> #i ...
- 洛谷.3808/3796.[模板]AC自动机
题目链接:简单版,增强版 简单版: #include <cstdio> #include <cstring> const int N=1e6+5,S=26; char s[N] ...
- POJ 1625 Censored!(AC自动机->指针版+DP+大数)题解
题目:给你n个字母,p个模式串,要你写一个长度为m的串,要求这个串不能包含模式串,问你这样的串最多能写几个 思路:dp+AC自动机应该能看出来,万万没想到这题还要加大数...orz 状态转移方程dp[ ...
- luoguP3796[模板]AC自动机(加强版)
传送门 ac自动机模板,可能我写的ac自动机是有点问题的,所以跑的有些慢 暴力跳fail统计 代码: #include<cstdio> #include<iostream> # ...
- Ring HDU - 2296 AC自动机+简单DP和恶心的方案输出
题意: 就是现在给出m个串,每个串都有一个权值,现在你要找到一个长度不超过n的字符串, 其中之前的m个串每出现一次就算一次那个字符串的权值, 求能找到的最大权值的字符串,如果存在多个解,输出最短的字典 ...
- 算法模板——AC自动机
实现功能——输入N,M,提供一个共计N个单词的词典,然后在最后输入的M个字符串中进行多串匹配(关于AC自动机算法,此处不再赘述,详见:Aho-Corasick 多模式匹配算法.AC自动机详解.考虑到有 ...
- 模板 AC自动机
题目描述 有$N$ 个由小写字母组成的模式串以及一个文本串$T$ .每个模式串可能会在文本串中出现多次.你需要找出哪些模式串在文本串$T$ 中出现的次数最多. 输入输出格式 输入格式: 输入含多组数据 ...
- 算法竞赛模板 AC自动机
AC自动机基本操作 (1) 在AC自动机中,我们首先将每一个模式串插入到Trie树中去,建立一棵Trie树,然后构建fail指针. (2) fail指针,是穿插在Trie树中各个结点之间的指针,顾名思 ...
- 小明系列故事――女友的考验 HDU - 4511 AC自动机+简单DP
题意:自己看题目,中文体面. 题解: 把所有不能走的路径放入AC自动机中. 然后DP[i][j]表示走到 i 这个点,且位于AC自动机 j 这个节点最短距离 然后直接DP即可.注意一点会爆int #i ...
随机推荐
- learn python the hard way 习题6~10总结
习题6总结 定义字符串: 名字 = 值 其他 你也可以用 {types_of_people}的方式把它放在任何字符串中. 也就是说你可以在其他字符串中添加{},然后前面加一个 f,可用print()进 ...
- 方差variance, 协方差covariance, 协方差矩阵covariance matrix | scatter matrix | weighted covariance | Eigenvalues and eigenvectors
covariance, co本能的想到双变量,用于描述两个变量之间的关系. correlation,相关性,covariance标准化后就是correlation. covariance的定义: 期望 ...
- @suppresswarnings(unchecked)的作用
@suppresswarnings(unchecked)的作用 一般在项目中会出现红色的报错,这个是影响项目运行的,无法启动,会停在那里,而warning警告,黄色的虽然不是会让项目停止,但是却是不规 ...
- 第一章 Lab
关于Lab 教材恶意代码分析实战 课后练习恶意代码样本https://practicalmalwareanalysis.com或https://nostarch.com/malware.htm 以下是 ...
- 架构探险笔记11-与Servlet API解耦
Servlet API解耦 为什么需要与Servlet API解耦 目前在Controller中是无法调用Servlet API的,因为无法获取Request与Response这类对象,我们必须在Di ...
- 最长回文字串——manacher算法
时间复杂度:O(n) 参考:https://segmentfault.com/a/1190000003914228 1.问题定义 最长回文子串问题:给定一个字符串,求它的最长回文子串长度. 如果一个字 ...
- GitHub 翻译之 'Hello-world' 翻译
https://guides.github.com/activities/hello-world/ 页面翻译 The Hello World project is a time-honored tra ...
- CRM UI 打印PDF
这是项目上看到的绝技^_^ 1.画SF.这步就不说了 2.确定参数,写SF打印PDF函数 FUNCTION zsrv_print_to_pdf . *"------------------- ...
- flask-后台布局页面搭建4
1. 搭建后台页面 5.1管理员登录 步骤:1.在admin视图中导入from flask import render_template,redirect,url_for.并写入一下代码. #登录 ...
- java redis client jedis 测试及常用命令
package cn.byref.demo1; import java.util.HashMap;import java.util.List;import java.util.Map;import j ...