hdu 2222 Keywords Search(ac自动机)
题目链接 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自动机)相关推荐
- hdu 2222 Keywords Search AC自动机——多串匹配
http://acm.hdu.edu.cn/showproblem.php?pid=2222 题意: 给出n个单词,再给出一段包含m个字符的文章,求有多少个单词在文章里出现过. 思路: 才开开始以为简 ...
- HDU 2222 Keywords Search (AC自动机模板题)
一组数据: 1 3 sss sss sss sss ans:3 #include <cstdio> #include <cstdlib> #include <vector ...
- HDU - 2222 Keywords Search(AC自动机)
题目链接:点击查看 题目大意:给出n个长度不超过50的模式串,再给出一个长度不超过1e6的主串,问模式串在主串中出现过多少次 题目分析:一开始我以为是求n次KMP,后来才知道这样做的时间复杂度是O(L ...
- hdu 2222 Keywords Search ac自己主动机
点击打开链接题目链接 Keywords Search Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Ja ...
- HDU 2222 Keywords Search【ACAM】
HDU 2222 Kerwords Search 代码风格模仿自:USETC每周算法讲解,AC自动机,郭老师! 输入一个T,对于每一个T给你一个n,接下来输入P个模式串,然后给你一个L串,L中出现了多 ...
- hdu 2222:Keywords Search
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) Total Submissi ...
- Keywords Search AC自动机QAQ
AC自动机,一直以来都以为是一个非常高大上的算法,其实它还真的挺高大上的. 首先来说,ac自动机的思想与kmp类似,需要自己模拟来理解. 给两个博客: http://www.cppblog.com/m ...
- HDU 2222 Keywords Search
HDU_2222 今天开始学AC自动机了,这个就是我AC自动机的处女作了.这个题有个小trick就是单词列表中可能有重复的单词,但这些重复的单词应看做不同的,因此建字典树时做标记的时候,把原来的赋值为 ...
- [hdu2222]Keywords Search(AC自动机)
题意:给定n个单词,一个字符串,问字符串中出现了多少个单词. 解题关键:AC自动机模板题,注意根据题意,匹配完成之后要置0. 注意char数组也可以用cin, 注意理解AC自动机,不可能在同一层 出现 ...
最新文章
- 第二课.多元高斯分布与其几何特征
- 两个排序数组的中位数
- cvs数据导入工具 oracle_为中国企业打造的研发项目管理工具ONES Project已支持Jira数据导入...
- 命令行cd到_前端(只)需要掌握这些命令行(就还行了)
- loadrunner简介
- Raft协议选举核心思想
- char* 赋值 const char* 释放_嵌入式Linux开发《C语言专题(十:彻底搞懂“关键字”const)》...
- Lync Server外部访问系列PART4:部署反向代理
- cvc-complex-type.2.4.c: The matching wildcard is strict, but no declaration的解决
- 飞客蠕虫病毒的介绍与处理办法
- apple iphone 3gs 有锁机 刷机 越狱 解锁 全教程(报错3194,3014,1600,短信发不出去等问题可参考)...
- HTML5 如何让背景图片自适应浏览器大小
- 英语语法---代词详解
- EAN校验码的计算方法
- Unity3d学习之路-简单AR游戏
- Cerebral Cortex:疼痛热刺激引起的脑功能网络分离与整合
- mq中消息消费的几种方式
- 基于Linux的树莓派和电脑之间的串口通信编程
- WebBrowser打开Word文档的一些注意事项
- java对文件分片处理
热门文章
- linux一g运行内存不足,在linux运行weblogic出现运行内存不足错误,求鞭挞....
- python爬取新闻网站内容_python爬虫案例:抓取网易新闻
- 方法有多少个参数才算多?
- LOJ 2979 「THUSCH 2017」换桌——多路增广费用流
- 利用cookies跳过登陆验证码
- 完成聊天室的私聊功能
- vue2 watch引用类型 失败原因
- Codeforces Round #201 (Div. 2)C,E
- 地图图元的闪烁效果制作
- mysql inode_Linux中inode的大小、作用讲述