【模板】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 ...
随机推荐
- 【消息队列】kafka是如何保证高可用的
一.kafka一个最基本的架构认识 由多个broker组成,每个broker就是一个节点:创建一个topic,这个topic可以划分为多个partition,每个partition可以存在于不同的br ...
- 2018JavaScript状态调查:5个重要的思考( import takeaways) (摘译)
英文原文 (内有视频). 以下是翻译和摘录. 最近JS状态调查结构出来了,如果你关心网页开发,你会关心这些结果. 本文探索5个takeaways并总结这些结论. 1. JavaScript Had ...
- stark组件base.html
stark 组件基础页面base.html 文件 base.html 1. base.html 页面是 : stark组件增,删,改,查页面的公共部分,如头部导航栏,左侧的用户权限列表栏等. 2. b ...
- linux基础知识(1)
1.date man date :查看帮助 1. date [OPTION]... [+FORMAT]:显示时间 ,format表示格式符号 例如: date :Sun Dec 23 21:45:34 ...
- php 商场收银收费系统,使用的策略模式
<?php//策略模式就是你有很多的方法,选择一种适合自己的,// 单例模式就是只有一个实例对象,不需要每个文件都要加载,比如连接数据库,// 工厂模式就是 //策略模式 优惠系统.工资计算系统 ...
- python-flask-script定制manage命令
安装: pip3 install flask-script #!/usr/bin/env python # -*- coding:utf-8 -*- from flask_script import ...
- leetcode-algorithms-4 Median of Two Sorted Arrays
leetcode-algorithms-4 Median of Two Sorted Arrays There are two sorted arrays nums1 and nums2 of siz ...
- python low版线程池
1.low版线程池设计思路:运用队列queue 将线程类名放入队列中,执行一个就拿一个出来import queueimport threading class ThreadPool(object): ...
- SEND EMAIL SO_DOCUMENT_SEND_API1
FUNCTION zcrm_send_email_and_attach . *"------------------------------------------------------- ...
- Div和Span
Div ——层级元素,这一行不允许有其他元素(用来布局) Span ——用来修饰文本