题目链接

题意

  1. 给定 n 个单词,和一个字符串 s,问 n 个单词中有多少个在 s 中出现了。

思路

  1. 明细 ac 自动机模板题,我们先把 n 个单词建立 ac 自动机树,然后统计每个单词在每个单词在相应的结尾上出现的次数(在单词结尾的位置打上标记)。
  2. 然后用 s 在自动机树上进行匹配,对于每配到一个位置节点,我们都沿着这个节点,while 循环跳这个点的 fail 指针,如果每跳到一个点就就加上一个这个点结尾的单词的个数。

代码

#include <bits/stdc++.h>
using namespace std;const int N = 5e5 + 10, M = 1e6 + 10;
int tr[N][26], fa[N], idx, num[N];
char s[M];void init()
{memset(tr, 0, sizeof tr);memset(fa, 0, sizeof fa);memset(num,0, sizeof num);idx = 0;
}void insert(char s[])
{int p = 0;for (int i = 0; s[i]; i ++) {int c = s[i] - 'a';if (tr[p][c] == 0) tr[p][c] = ++ idx;p = tr[p][c];}num[p] ++;
}void build()
{int p = 0;queue<int> q;for (int i = 0; i < 26; i ++) {if (tr[p][i]) q.push(tr[p][i]);}while (q.size()){p = q.front(); q.pop();for (int i = 0; i < 26; i ++) {if (tr[p][i]) fa[tr[p][i]] = tr[fa[p]][i], q.push(tr[p][i]);else tr[p][i] = tr[fa[p]][i];}}
}int main()
{int T; scanf("%d", &T);while (T --){init();int n; scanf("%d", &n);for (int i = 0; i < n; i ++) {scanf("%s", s);insert(s);}build();scanf("%s", s);int p = 0, ans = 0;for (int i = 0; s[i]; i ++) {int c = s[i] - 'a';p = tr[p][c];int t = p;while (t){ans += num[t];num[t] = 0;t = fa[t];}}printf("%d\n", ans);}return 0;
}

acwing1282. 搜索关键词(AC 自动机)相关推荐

  1. 20191021 练习:模拟+搜索+二分+AC自动机

    T1 特殊排序 (时间限制:1秒 内存限制:128MB) [题目描述] 写一个程序,对于读入的一对正整数 x x x和 y y y,将这两个数之间(包括这两个数本身)的所有数按下述特别规则排序后输出, ...

  2. 字符串算法 | AC自动机算法

    1.简介 一种多模式串匹配算法, 可以快速从主串中同时找出所有包含的所有模式串. 对比KMP是单模式匹配, 虽然可以使用单模式串匹配算法逐个进行查找模式串, 但是实际场景中,若模式串的数量可能很大,并 ...

  3. [JSOI2009]密码——AC自动机+记忆化搜索(状压)

    题面 Bzoj1559 解析  要求一个能包含所有字符串的串的个数,联想到AC自动机. 每一个节点需要存一个终点信息,即以这个点为结尾的字符串编号,这个需要开一个vector来存,因为一个节点需要继承 ...

  4. 关键词匹配(Ac自动机模板题)

    2772: 关键词匹配 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 10  Solved: 4 [Submit][Status][Web Board ...

  5. Python——利用AC自动机进行关键词提取

    Python--利用AC自动机进行关键词提取 目标:在之前写的文章[Python实现多模匹配--AC自动机]基础上,安装gcc(C编译器),再装ahocorasick ,并完成从文本中提取关键词的任务 ...

  6. python使用esmre代替ahocorasick实现ac自动机[多模匹配]

    Toggle navigation Home saltstack ansible zabbix docker python Golang web开发 运维开发 运维 文艺 python使用esmre代 ...

  7. AC自动机(写的很乱,仅记录留作自己复习)

    AC自动机 众所周知,AC自(bu)动机是可以自动wa的一种算法(不是 首先,AC自动机解决什么问题? ------多字符串匹配问题 算法原理是什么? 其基本思想,是字典树+KMP(仅为思想),字典树 ...

  8. 数据结构与算法之美笔记——基础篇(下):图、字符串匹配算法(BF 算法和 RK 算法、BM 算法和 KMP 算法 、Trie 树和 AC 自动机)

    图 如何存储微博.微信等社交网络中的好友关系?图.实际上,涉及图的算法有很多,也非常复杂,比如图的搜索.最短路径.最小生成树.二分图等等.我们今天聚焦在图存储这一方面,后面会分好几节来依次讲解图相关的 ...

  9. AC自动机笔记与例题整理

    TP KMP AC自动机建树/图 最后就是例题时间: 搜索关键词 单词 设计密码 修复DNA Codeforces16届黑龙江省赛E题 洛谷:阿狸打字机(经典自动机,fail树上数据结构维护信息) [ ...

  10. AC自动机算法详解以及Java代码实现

    详细介绍了AC自动机算法详解以及Java代码实现. 文章目录 1 概念和原理 2 节点定义 3 构建Trie前缀树 3.1 案例演示 4 构建fail失配指针 4.1 案例演示 5 匹配文本 5.1 ...

最新文章

  1. bp 字母识别 java_Matlab实现BP网络识别字母
  2. Linux帮助信息获取
  3. Connected to an idle instance问题的小小仇恨
  4. java jdbc连接derby,通过JDBC连接到Derby数据库失败
  5. .NET 平台采用率的提升归功于开源
  6. 求字符串里里面字符出现的次数和出现哪些不同的字符的字符串
  7. apache.camel_Apache Camel 2.23发布
  8. 解决gensim报错AttributeError: type object ‘Word2Vec‘ has no attribute ‘load_word2vec_format‘
  9. 用TF实现线性回归模型。
  10. 云服务器一般选什么系统,云服务器一般选择什么系统好
  11. vue ui创建项目报错:Cannot read property ‘indexOf‘ of undefined解决方法
  12. C#winform两个或多个panel重叠布局时如何显示一个
  13. 编程实现激光雷达点云数据提取道路特征
  14. 归并排序 java_Java实现归并排序
  15. Cesium 场景设置~黑白、夜视和描边
  16. 人工智能-SVM 支持向量机
  17. 如何将qlv格式转换为mp4格式?怎么将qlv的文件然后转换成mp4视频?
  18. 论程序员如何正确上班摸鱼
  19. 教你免费将手机里的PDF转Word还能同步到电脑
  20. 在浏览器的标签页显示网站标志图标

热门文章

  1. Mac OS 使用asio库
  2. CFA大起底:三百六十度无死角详解CFA到底是个啥?
  3. 汽车租赁管理系统(管理车辆基本信息、租车/还车、统计租金)
  4. 医视云助力清华长庚医院开展肝胆外科肿瘤远程多学科会诊
  5. 虚幻4 - ARPG实战教程(第一季)
  6. c语言表达式优先级最高的是,C语言运算符优先级表
  7. 街机中国 FBA4droid 应用
  8. Python标准库与扩展库中对象的导入与使用
  9. 波利亚《如何解题 How to Solve It》
  10. 白话图解机器学习里的Regularization正则化