AC自动机模板浅讲
Description
给你N个单词,然后给定一个字符串,问一共有多少单词在这个字符串中出现过(输入相同的字符串算不同的单词,同一个单词重复出现只计一次)。
Input
第一行一个整数N,表示给定单词的个数。
接下来N行,每行输入一个长度不超过50且全由小写字母组成的单词。
最后一行输入一个长度不超过1000000的字符串。
N≤10000
Output
输出一行包含一个整数,表示共在给定字符串中出现过的单词个数。
样例:
Input
5
she
he
say
shr
her
yasherhs
Output
3
关于AC自动机:
Aho-Corasick automaton,该算法在1975年产生于贝尔实验室,是著名的多模匹配算法。
假设我们已经学会了Trie树,类似于KMP算法的,我们对于树上的每个节点,处理出在此
节点下后,在树上应该跳转到的点,用nxt数组记录;
那么,如何求出nxt数组呢???
首先,如果x接下来要匹配的字符与now节点直接相连,那我们肯定直接跳到下一个节点。
如果当前字符无法继续匹配,就跳到now节点的nxt的与此字符对应的节点上去
然后,与根节点直接相连的节点就直接预处理一下就好了。
例:对于样例,我们先建一棵Trie树(图中加着重号的为每个单词的终止节点)

将所有根节点的子节点的nxt数组指向根节点,再将这些节点加入队列。
然会对于队列里的每一个节点,从a枚举到z,如果当前结点没有这个字符儿子
就将它指向它的nxt节点的儿子,这样我们就成功的将Trie树建成了Trie图

处理出来就是这样知道,然后对文本串依次遍历匹配,统计答案就可以了
code:
#include<bits/stdc++.h>
#define N 1001000
using namespace std;
int cnt,n;
int tree[N],dl[N],num[N],net[N],son[N][30];
char s1[N],s2[N];
void ins(){//建Trie树
int now=0,l=strlen(s1+1);
for(int i=1;i<=l;i++){
if(!son[now][s1[i]-'a'+1])
son[now][s1[i]-'a'+1]=++cnt;
now=son[now][s1[i]-'a'+1];
}
num[now]++;//记录单词尾
}
void get_net(){
int t=1,w=0;
for(int i=1;i<=26;i++)
if(son[0][i])dl[++w]=son[0][i];//预处理与根节点相连的节点
while(t<=w){//BFS处理net数组
int now=dl[t];
for(int i=1;i<=26;i++){
if(!son[now][i])son[now][i]=son[net[now]][i];
else{
net[son[now][i]]=son[net[now]][i];
dl[++w]=son[now][i];
}
}
t++;
}
}
void fuck(){
int now=0,ans=0,l=strlen(s2+1);
for(int i=1;i<=l;i++){
now=son[now][s2[i]-'a'+1];
int to=now;
while(to!=0&&num[to]!=-1){
ans+=num[to];
num[to]=-1;//已经统计过的单词不要再次统计
to=net[to];
}
}
printf("%d\n",ans);
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){scanf("%s",s1+1);ins();}
get_net();scanf("%s",s2+1);
fuck();
return 0;
}
蒟蒻题解,欢迎指正;
水平太低,大佬勿喷;
AC自动机模板浅讲的更多相关文章
- HDU 2222 AC自动机模板题
题目: http://acm.hdu.edu.cn/showproblem.php?pid=2222 AC自动机模板题 我现在对AC自动机的理解还一般,就贴一下我参考学习的两篇博客的链接: http: ...
- Match:Keywords Search(AC自动机模板)(HDU 2222)
多模匹配 题目大意:给定很多个字串A,B,C,D,E....,然后再给你目标串str字串,看目标串中出现多少个给定的字串. 经典AC自动机模板题,不多说. #include <iostream& ...
- HDU 3065 (AC自动机模板题)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3065 题目大意:多个模式串,范围是大写字母.匹配串的字符范围是(0~127).问匹配串中含有哪几种模 ...
- HDU 2896 (AC自动机模板题)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2896 题目大意:多个模式串.多个匹配串.其中串的字符范围是(0~127).问匹配串中含有哪几个模式串 ...
- HDU 2222(AC自动机模板题)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2222 题目大意:多个模式串.问匹配串中含有多少个模式串.注意模式串有重复,所以要累计重复结果. 解题 ...
- HDU 2222 (AC自动机模板题)
题意: 给一个文本串和多个模式串,求文本串中一共出现多少次模式串 分析: ac自动机模板,关键是失配函数 #include <map> #include <set> #incl ...
- hdu 2222 Keywords Search ac自动机模板
题目链接 先整理一发ac自动机模板.. #include <iostream> #include <vector> #include <cstdio> #inclu ...
- KMP与AC自动机模板
HDU 1711 Number Sequence(KMP模板题) http://acm.hdu.edu.cn/showproblem.php?pid=1711 #include<bits/std ...
- HDU3695(AC自动机模板题)
题意:给你n个字符串,再给你一个大的字符串A,问你着n个字符串在正的A和反的A里出现多少个? 其实就是AC自动机模板题啊( ╯□╰ ) 正着query一次再反着query一次就好了 /* gyt Li ...
随机推荐
- 浙江省CIO协会钱塘江论坛近日在网易云创沙龙宣布成立
本文来自网易云社区 9月19日,由网易云与浙江省首席信息官协会共同主办的“网易云创CIO沙龙”在杭州举行,本次活动以“瞩目钱塘,赋能企业数字化创新”为主题,网易云企业服务部总经理岳峥辉,浙江省首席信息 ...
- 开车旅行 2012年NOIP全国联赛提高组(倍增+set)
开车旅行 2012年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 小A 和小B决定利用 ...
- [Swift]Array(数组)扩展
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...
- oracle-数据库泵EXPDP导出用户下所有
1登录sys用户 2创建目录 create directory [dirname] as ‘[dirpath]’; dirname:取的名字 dirpath:dmp文件导出路径 示例:create d ...
- Asp 循环输出 form 表单提交的数据
亲测asp提交form表单数据,在接收页面循环输出数据 dim var for each var in request.form response.write var&"=" ...
- [Python实战] 功能简单的数据查询及可视化系统
前言 数据时代,数据的多源集成和快速检索查询是第一步,配上数据分析及可视化才能算窥得大数据一角. 创建这个项目的主要目的一是对前期工作的一些总结,二是提升自己. 这里简单介绍一下sqlpro这个项目的 ...
- ajax怎么理解?
Ajix是创建交互式网页的前端网页开发技术,不是一种语言,ajax是基于http来传输数据的,他是利用浏览器提供操作http的接口(XMLHttpRequest或者activeXobject),来操作 ...
- 语音跟踪:信号分解、锁相、鸡尾酒会效应、基于PR的信号分离
NLP中关于语音的部分,其中重要的一点是语音信号从背景噪音中分离.比如在一个办公室场景中,有白天的底噪-类似于白噪音的噪音.空调的声音.键盘的啪啪声.左手边45度7米元的地方同事讨论的声音.右手边1. ...
- 远程图形界面:使用putty+xmin远程登录ubuntu-kde
让我继续用反人类的编辑器Vim和emacs,我宁愿自断三指.因此,在Win端配置WinSCP+Putty+Xming远程操作ubuntu. 参考链接:putty+xming远程登录Ubuntu16.0 ...
- 字符编码方式ASCII、Unicode、UTF-8
一.ASCII 1.介绍 即American Standard Code for Information Interchange(美国信息交换标准代码),是基于拉丁字母的,主要用于显示现代英语和其他西 ...