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自动机模板浅讲的更多相关文章

  1. HDU 2222 AC自动机模板题

    题目: http://acm.hdu.edu.cn/showproblem.php?pid=2222 AC自动机模板题 我现在对AC自动机的理解还一般,就贴一下我参考学习的两篇博客的链接: http: ...

  2. Match:Keywords Search(AC自动机模板)(HDU 2222)

    多模匹配 题目大意:给定很多个字串A,B,C,D,E....,然后再给你目标串str字串,看目标串中出现多少个给定的字串. 经典AC自动机模板题,不多说. #include <iostream& ...

  3. HDU 3065 (AC自动机模板题)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3065 题目大意:多个模式串,范围是大写字母.匹配串的字符范围是(0~127).问匹配串中含有哪几种模 ...

  4. HDU 2896 (AC自动机模板题)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2896 题目大意:多个模式串.多个匹配串.其中串的字符范围是(0~127).问匹配串中含有哪几个模式串 ...

  5. HDU 2222(AC自动机模板题)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2222 题目大意:多个模式串.问匹配串中含有多少个模式串.注意模式串有重复,所以要累计重复结果. 解题 ...

  6. HDU 2222 (AC自动机模板题)

    题意: 给一个文本串和多个模式串,求文本串中一共出现多少次模式串 分析: ac自动机模板,关键是失配函数 #include <map> #include <set> #incl ...

  7. hdu 2222 Keywords Search ac自动机模板

    题目链接 先整理一发ac自动机模板.. #include <iostream> #include <vector> #include <cstdio> #inclu ...

  8. KMP与AC自动机模板

    HDU 1711 Number Sequence(KMP模板题) http://acm.hdu.edu.cn/showproblem.php?pid=1711 #include<bits/std ...

  9. HDU3695(AC自动机模板题)

    题意:给你n个字符串,再给你一个大的字符串A,问你着n个字符串在正的A和反的A里出现多少个? 其实就是AC自动机模板题啊( ╯□╰ ) 正着query一次再反着query一次就好了 /* gyt Li ...

随机推荐

  1. 栗染-github中搭建博客遇到的问题之一

    运行命令:git push -u origin master To https://github.com/xuzhezhaozhao/Practice.git ! [rejected] master ...

  2. BFS(最短路+路径打印) POJ 3984 迷宫问题

    题目传送门 /* BFS:额,这题的数据范围太小了.但是重点是最短路的求法和输出路径的写法. dir数组记录是当前点的上一个点是从哪个方向过来的,搜索+,那么回溯- */ /************* ...

  3. 《从Paxos到ZooKeeper 分布式一致性原理与实践》阅读【Leader选举】

    从3.4.0版本开始,zookeeper废弃了0.1.2这3种Leader选举算法,只保留了TCP版本的FastLeaderElection选举算法. 当ZooKeeper集群中的一台服务器出现以下两 ...

  4. 《从Paxos到ZooKeeper 分布式一致性原理与实践》阅读【Watcher】

    ZooKeeper 允许客户端向服务端注册一个 Watcher 监听,当服务端的一些指定事件触发了这个 Watcher,那么就会向指定客户端发送一个事件通知来实现分布式的通知功能. ZooKeeper ...

  5. ES6 学习笔记 - let和const

    let 和 const 命令 学习资料:ECMAScript 6 入门 let 所声明的变量,只在let命令所在的代码块内有效.用途:循环计数器. 如果使用var,只有一个全局变量i: var a = ...

  6. CSS笔记集合

    CSS CSS 认识 CSS全称为层叠样式表,主要是用于定义HTML内容在浏览器内的显示样式. CSS样式由选择符和声明组成,而声明又由属性和值组成. CSS中注释语句:/*注释语句*/.Html中使 ...

  7. AngularJs与Java Web服务器交互

    AngularJs是Google工程师研发的产品,它的强大之处不是几句话就能描述的,只有真正使用过的人才能体会到,笔者准备在这篇文章中,以一个简单的登录校验的例子说明如何使用AngularJs和Web ...

  8. Python自动监控错误日志

    平时在查看日志的时候打开满屏的日志,看上去有点凌乱.于是写个Python脚本过滤出想要看的错误的日志.直接上脚本 脚本示例 def read_log(logname,keyword): tell = ...

  9. fragment间的数据传递

    今天我将要讲的是fragment间的数据是如何进行传递的.这里我将举个简单的例子. 首先要有个MainActivity,它托管了MainFragment,而MainFragment又托管了DatePi ...

  10. Magento 多站点多域名安装教程(可以设置手机模版哟,亲 \(^o^)/)

    这篇文章是安装magento子域名的教程,请先进行安装之前,确认以下几点: 1.请先确认子域名是否已经指向你的服务器 2.可以编辑.htaccess文件 3. 熟悉Cpanel操作 我们的目标是建立一 ...