算法竞赛模板 AC自动机
AC自动机基本操作
(1) 在AC自动机中,我们首先将每一个模式串插入到Trie树中去,建立一棵Trie树,然后构建fail指针。
(2) fail指针,是穿插在Trie树中各个结点之间的指针,顾名思义,就是当匹配失败的时候,用于引导p指针回溯,就和KMP算法中的next数组道理相同。
#include<bits/stdc++.h>
using namespace std;
#define MAX 26 //字典树关键字为‘a’~‘b’
char str[]; //主串(文章)
int n; //模式串共有n串 //字典树结点定义
struct Node
{
Node*next[MAX];
Node*fail;
int sum;
}*qu[]; void init(Node*root)
{
for(int i=;i<MAX;i++)
root->next[i]=NULL;
} //向字典树内添加模式串
void Insert(Node*root,char*ch)
{
Node*p=root;
while(*ch)
{
int index=*ch-'a';
if(p->next[index]==NULL)
{
p->next[index]=(Node*)malloc(sizeof(Node));
init(p->next[index]);
p->next[index]->sum=;
}
p=p->next[index];
ch++;
}
p->sum++;
} //利用模式串 字典树建树
Node*TrieCreate()
{
char ch[];
Node*root=(Node*)malloc(sizeof(Node));
init(root);
for(int i=;i<n;i++)
{
scanf("%s",ch);
Insert(root,ch);
}
return root;
} //在字典树内构建 失配指针fail
void BuildFail(Node*root)
{
int head=,tail=,i;
root->fail=NULL;
qu[tail++]=root;
while(head<tail)
{
Node*t=qu[head++];
Node*p=NULL;
for(i=;i<;i++)
{
if(t->next[i])
{
if(t==root)
t->next[i]->fail=root;
else
{
p=t->fail;
while(p)
{
if(p->next[i])
{
t->next[i]->fail=p->next[i];
break;
}
p=p->fail;
}
if(!p)
t->next[i]->fail=root;
}
qu[tail++]=t->next[i];
}
}
}
} //AC自动机 ,返回主串中模式串的数量(文章中关键字的数量)
int AC(Node*root,char*str)
{
int len=strlen(str),cnt=;
Node*p=root;
while(*str)
{
while(p->next[*str-'a']==NULL&&p!=root)p=p->fail;
p=p->next[*str-'a'];
p=(p==NULL)?root:p;
Node*t=p;
while(t!=root&&t->sum!=-)
{
cnt+=t->sum;
t->sum=-;
t=t->fail;
}
str++;
}
return cnt;
}
int main()
{
cin>>n;
Node*root=TrieCreate();
scanf("%s",str);
BuildFail(root);
printf("%d\n",AC(root,str));
return ;
}
算法竞赛模板 AC自动机的更多相关文章
- 算法模板——AC自动机
实现功能——输入N,M,提供一个共计N个单词的词典,然后在最后输入的M个字符串中进行多串匹配(关于AC自动机算法,此处不再赘述,详见:Aho-Corasick 多模式匹配算法.AC自动机详解.考虑到有 ...
- 算法总结篇---AC自动机
目录 写在前面 算法流程 引例: 概述: Trie树的构建(第一步) 失配指针(第二步) 构建失配指针 字典树和字典图 多模式匹配 例题 写在前面 鸣谢: OiWiki 「笔记」AC 自动机---Lu ...
- luoguP3808[模板]AC自动机(简单版)
传送门 ac自动机模板题,裸的多串匹配 代码: #include<cstdio> #include<iostream> #include<algorithm> #i ...
- luoguP3796[模板]AC自动机(加强版)
传送门 ac自动机模板,可能我写的ac自动机是有点问题的,所以跑的有些慢 暴力跳fail统计 代码: #include<cstdio> #include<iostream> # ...
- 模板 AC自动机
题目描述 有$N$ 个由小写字母组成的模式串以及一个文本串$T$ .每个模式串可能会在文本串中出现多次.你需要找出哪些模式串在文本串$T$ 中出现的次数最多. 输入输出格式 输入格式: 输入含多组数据 ...
- 洛谷.3808/3796.[模板]AC自动机
题目链接:简单版,增强版 简单版: #include <cstdio> #include <cstring> const int N=1e6+5,S=26; char s[N] ...
- 算法竞赛模板 KMP
KMP算法图解: ① 首先,字符串“BBC ABCDAB ABCDABCDABDE”的第一个字符与搜索词“ABCDABD”的第一个字符,进行比较.因为B与A不匹配,所以搜索词后移一位. ② 因为B与A ...
- 模板—AC自动机
#include<iostream> #include<cstdio> #include<cstring> using namespace std; struct ...
- 算法竞赛模板 动态规划之背包DP
① 01背包 有n件物品和一个容量为v的背包.第i件物品的价值是c[i],体积是w[i].求解将哪些物品装入背包可使价值总和最大. 这是最基础的背包问题,特点是:每种物品仅有一件,可以选择放或不放. ...
随机推荐
- 二维码相关---java生成二维码名片,而且自己主动保存到手机通讯录中...
版权声明:本文为博主原创文章,未经博主credreamer 同意不得转载 违者追究法律责任. https://blog.csdn.net/lidew521/article/details/244418 ...
- SpringMVC学习(5):数据绑定2 @PathVariable、@CookieValue、@RequestHeader、@ModelAttribute..
在系列(4)中我们介绍了如何用@RequestParam来绑定数据,下面我们来看一下其它几个数据绑定注解的使用方法. 1.@PathVariable 用来绑定URL模板变量值,这个我们已经在系列(3) ...
- Python基础篇(is和==)
python基础篇(is,==,): 一.is和==的区别 1.id() 通过id()我们可以查看到一个变量表示的值在内存中的地址. s = 'alex' s = "alex" l ...
- linux下有趣的工具
1.toilet(在CentoOS7 安装) yum install -y https://raw.githubusercontent.com/sliqua-hosting/repo/master/c ...
- YUV/RGB与H264之间的编解码
1.源码下载 http://download.videolan.org/x264/snapshots/ 2.编译 ./configure --prefix=./_install --enable-sh ...
- Centos6安装mysql5.7最新版
最近因为公司的服务器需要做基线和漏洞扫描,基线方面问题不大,按照报告上的加固建议,选一些权重高的问题处理一下就好了.但是漏洞扫描就比较坑了,扫出来了十几个高危和一百六十多个中危漏洞,不过还好漏洞基本上 ...
- Nginx Web 基础入门
目录 Nginx Web 基础入门 Nginx快速安装 两种方式部署Nginx 如何升级nginx或者添加功能 使用systemd管理nginx nginx相关配置文件 nginx的配置文件详解 虚拟 ...
- numpy 数组中添加新元素
import numpy as npnew_array = np.empty(shape=[0, 3]) # 3列n行for i in range(10): x = i+1 y = i+2 z = i ...
- webpack 学习1 安装构建项目
本文中使用的webpack版本是4+,请注意区分 node.js安装 node.js下载地址 选择较低版本的稳定版下载,下载完成后得到的是一个msi文件,点击安装即可 安装完毕以后新建一个文件夹,并在 ...
- springboot关联Mybatis和Redis依赖
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot ...