题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=2222

题意:给你一系列子串,再给你一个主串问你主串一共有几个匹配子串

原来使用字典树写的但数据有点大TLE了,然后就开始学习ac自动机了,ac自动机就像是多串匹配的kmp原理也是类似的。

这题可以练一下手写ac自动机模版。

#include <iostream>
#include <cstring>
#include <cstdio>
#include <queue>
using namespace std;
const int M = 5e5 + 50;
int Next[M][26] , fail[M] , End[M] , root , L , cnt;
char str[60] , sl[M * 2];
int newnode() {for(int i = 0 ; i < 26 ; i++) {Next[L][i] = -1;}End[L++] = 0;return L - 1;
}
void init() {L = 0;root = newnode();
}
void build(char s[]) {int len = strlen(s);int now = root;for(int i = 0 ; i < len ; i++) {int id = s[i] - 'a';if(Next[now][id] == -1) {Next[now][id] = newnode();}now = Next[now][id];}++End[now];
}
void get_fail() {queue<int>q;fail[root] = root;for(int i = 0 ; i < 26 ; i++) {if(Next[root][i] == -1) {Next[root][i] = root;}else {fail[Next[root][i]] = root;q.push(Next[root][i]);}}while(!q.empty()) {int now = q.front();q.pop();for(int i = 0 ; i < 26 ; i++) {if(Next[now][i] == -1) {Next[now][i] = Next[fail[now]][i];}else {fail[Next[now][i]] = Next[fail[now]][i];q.push(Next[now][i]);}}}
}
void match(char s[]) {int now = root;int len = strlen(s);for(int i = 0 ; i < len ; i++) {int id = s[i] - 'a';now = Next[now][id];int temp = now;while(temp != root) {cnt += End[temp];End[temp] = 0;temp = fail[temp];}}
}
int main()
{int t;scanf("%d" , &t);while(t--) {int n;scanf("%d" , &n);init();for(int i = 0 ; i < n ; i++) {scanf("%s" , str);build(str);}get_fail();scanf("%s" , sl);cnt = 0;match(sl);printf("%d\n" , cnt);}return 0;
}

转载于:https://www.cnblogs.com/TnT2333333/p/6080469.html

hdu 2222 Keywords Search(ac自动机)相关推荐

  1. hdu 2222 Keywords Search AC自动机——多串匹配

    http://acm.hdu.edu.cn/showproblem.php?pid=2222 题意: 给出n个单词,再给出一段包含m个字符的文章,求有多少个单词在文章里出现过. 思路: 才开开始以为简 ...

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

    一组数据: 1 3 sss sss sss sss ans:3 #include <cstdio> #include <cstdlib> #include <vector ...

  3. HDU - 2222 Keywords Search(AC自动机)

    题目链接:点击查看 题目大意:给出n个长度不超过50的模式串,再给出一个长度不超过1e6的主串,问模式串在主串中出现过多少次 题目分析:一开始我以为是求n次KMP,后来才知道这样做的时间复杂度是O(L ...

  4. hdu 2222 Keywords Search ac自己主动机

    点击打开链接题目链接 Keywords Search Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Ja ...

  5. HDU 2222 Keywords Search【ACAM】

    HDU 2222 Kerwords Search 代码风格模仿自:USETC每周算法讲解,AC自动机,郭老师! 输入一个T,对于每一个T给你一个n,接下来输入P个模式串,然后给你一个L串,L中出现了多 ...

  6. hdu 2222:Keywords Search

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Total Submissi ...

  7. Keywords Search AC自动机QAQ

    AC自动机,一直以来都以为是一个非常高大上的算法,其实它还真的挺高大上的. 首先来说,ac自动机的思想与kmp类似,需要自己模拟来理解. 给两个博客: http://www.cppblog.com/m ...

  8. HDU 2222 Keywords Search

    HDU_2222 今天开始学AC自动机了,这个就是我AC自动机的处女作了.这个题有个小trick就是单词列表中可能有重复的单词,但这些重复的单词应看做不同的,因此建字典树时做标记的时候,把原来的赋值为 ...

  9. [hdu2222]Keywords Search(AC自动机)

    题意:给定n个单词,一个字符串,问字符串中出现了多少个单词. 解题关键:AC自动机模板题,注意根据题意,匹配完成之后要置0. 注意char数组也可以用cin, 注意理解AC自动机,不可能在同一层 出现 ...

最新文章

  1. 第二课.多元高斯分布与其几何特征
  2. 两个排序数组的中位数
  3. cvs数据导入工具 oracle_为中国企业打造的研发项目管理工具ONES Project已支持Jira数据导入...
  4. 命令行cd到_前端(只)需要掌握这些命令行(就还行了)
  5. loadrunner简介
  6. Raft协议选举核心思想
  7. char* 赋值 const char* 释放_嵌入式Linux开发《C语言专题(十:彻底搞懂“关键字”const)》...
  8. Lync Server外部访问系列PART4:部署反向代理
  9. cvc-complex-type.2.4.c: The matching wildcard is strict, but no declaration的解决
  10. 飞客蠕虫病毒的介绍与处理办法
  11. apple iphone 3gs 有锁机 刷机 越狱 解锁 全教程(报错3194,3014,1600,短信发不出去等问题可参考)...
  12. HTML5 如何让背景图片自适应浏览器大小
  13. 英语语法---代词详解
  14. EAN校验码的计算方法
  15. Unity3d学习之路-简单AR游戏
  16. Cerebral Cortex:疼痛热刺激引起的脑功能网络分离与整合
  17. mq中消息消费的几种方式
  18. 基于Linux的树莓派和电脑之间的串口通信编程
  19. WebBrowser打开Word文档的一些注意事项
  20. java对文件分片处理

热门文章

  1. linux一g运行内存不足,在linux运行weblogic出现运行内存不足错误,求鞭挞....
  2. python爬取新闻网站内容_python爬虫案例:抓取网易新闻
  3. 方法有多少个参数才算多?
  4. LOJ 2979 「THUSCH 2017」换桌——多路增广费用流
  5. 利用cookies跳过登陆验证码
  6. 完成聊天室的私聊功能
  7. vue2 watch引用类型 失败原因
  8. Codeforces Round #201 (Div. 2)C,E
  9. 地图图元的闪烁效果制作
  10. mysql inode_Linux中inode的大小、作用讲述