【HDOJ2222】Keywords Search(AC自动机)
problem
- 给定n(< 1e4)个长度不超过50的单词(模式串)和一篇长为m(< 1e6)的文章(主串)。
- 求多少个单词在文章中出现了。
solution
- AC自动机模板
1、将所有模式串构建成字典树
2、求出nxt数组,其中nxt[i]表示匹配到i节点i的转移边都不能匹配了,满足最长前后缀关系的新节点。
3、继续匹配
codes
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
const int maxn = 5e5+5;int tot, tire[maxn][30], val[maxn], nxt[maxn];
void build(){tot = 1;memset(val,0,sizeof(val));memset(tire,0,sizeof(tire));
}
void insert(char *s){int u = 1, len = strlen(s);for(int i = 0; i < len; i++){int c = s[i]-'a';if(tire[u][c]==0)tire[u][c] = ++tot;u = tire[u][c];}val[u]++;return ;
}
int find(char *s){int ans = 0;int u = 1, len = strlen(s);for(int i = 0; i < len; i++){int c = s[i]-'a';int k = tire[u][c];while(k > 1){ans += val[k];val[k] = 0;k = nxt[k];}u = tire[u][c];}return ans;
}
void genfail(){for(int i = 0; i < 26; i++)tire[0][i] = 1;queue<int>q;q.push(1); nxt[1] = 0;while(q.size()){int u = q.front(); q.pop();for(int i = 0; i < 26; i++){if(!tire[u][i])tire[u][i] = tire[nxt[u]][i];//如果不存在u->i转移边,就直接回到第一个满足字符i的节点else{q.push(tire[u][i]);nxt[tire[u][i]] = tire[nxt[u]][i];}}}
}char s[maxn<<1];
int main(){int T; scanf("%d",&T);while(T--){build();int n; scanf("%d",&n);for(int i = 1; i <= n; i++){scanf("%s",s);insert(s);}genfail();scanf("%s",s);printf("%d\n",find(s));}return 0;
}
【HDOJ2222】Keywords Search(AC自动机)相关推荐
- HDU 2222 Keywords Search (AC自动机模板题)
一组数据: 1 3 sss sss sss sss ans:3 #include <cstdio> #include <cstdlib> #include <vector ...
- Keywords Search AC自动机QAQ
AC自动机,一直以来都以为是一个非常高大上的算法,其实它还真的挺高大上的. 首先来说,ac自动机的思想与kmp类似,需要自己模拟来理解. 给两个博客: http://www.cppblog.com/m ...
- HDU - 2222 Keywords Search(AC自动机)
题目链接:点击查看 题目大意:给出n个长度不超过50的模式串,再给出一个长度不超过1e6的主串,问模式串在主串中出现过多少次 题目分析:一开始我以为是求n次KMP,后来才知道这样做的时间复杂度是O(L ...
- hdu 2222 Keywords Search AC自动机——多串匹配
http://acm.hdu.edu.cn/showproblem.php?pid=2222 题意: 给出n个单词,再给出一段包含m个字符的文章,求有多少个单词在文章里出现过. 思路: 才开开始以为简 ...
- [hdu2222]Keywords Search(AC自动机)
题意:给定n个单词,一个字符串,问字符串中出现了多少个单词. 解题关键:AC自动机模板题,注意根据题意,匹配完成之后要置0. 注意char数组也可以用cin, 注意理解AC自动机,不可能在同一层 出现 ...
- hdu 2222 Keywords Search ac自己主动机
点击打开链接题目链接 Keywords Search Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Ja ...
- HUD2222 Keywords Serch AC自动机
传送门 显然这是一道AC自动机的模板题 但是还有一些地方需要注意: 1.多组数据要每次清空数组 2.关键字重复要累加,但是文本重复不能累加,可以打标记解决 #include<cstdio> ...
- Keywords Search HDU - 2222(AC自动机模板)
题意: 给定 n个长度不超过 50的由小写英文字母组成的单词准备查询,以及一篇文章,问:文中出现了多少个待查询的单词.多组数据. 题目: In the modern time, Search engi ...
- HDU2222 Keywords Search(AC自动机模板)
AC自动机是一种多模式匹配的算法.大概过程如下: 首先所有模式串构造一棵Trie树,Trie树上的每个非根结点都代表一个从根出发到该点路径的字符串. 然后每个结点都计算出其fail指针的值,这个fai ...
最新文章
- QT5界面操作3: QPainter和paintEvent(self, event)的配合
- 动态换ip如何实现_动态IP可以实现哪些功能及用途
- CUDA中并行规约(Parallel Reduction)的优化
- 金属,塑料,傻傻分不清楚
- red hat linux 虚拟机,Red Hat linux 的安装详细流程(包括VM虚拟机的设置)
- 北京公交将标配智能辅助驾驶,具备行人防撞、车道偏离预警
- python顺序查找的递归算法_Python实现查找算法
- yarn-cluster 和yarn-client区别
- 一般纳税人和小规模纳税人哪个好?哪个更划算?
- ITSS服务管理体系建立流程(四个阶段)附:广东软件行业协会ITSS评估
- 戴尔服务器虚拟光驱,SupportAssist
- 全面对战LILO 和 GRUB
- 解决尝试连接“ECONNREFUSED - 连接被服务器拒绝”失败的问题
- 07_音频录制01_命令行
- CRC16_CCITT/True的Java计算实现
- WPS表格 JSA-单格内,按文字颜色处理文字
- Java毕业设计-考试管理系统
- java 字符串签名_Java-方法签名
- 百度地图setMapStyle
- AST实战|AST入门与实战星球高频问题汇总(二)
热门文章
- C Tricks(十三)—— trim 的实现
- Tricks(二十五)—— decorator(在函数调用前后打印日志)
- 标准模板库(STL)之 map 列传 (二)
- C/C++ debug(一)
- C++基础——简单而强大的bitset
- linux 系统管理员面试,经典linux系统工程师系统管理员面试题
- linux dd命令 配额,第四章 Centos7.5下LVM操作与磁盘配额
- mysql 将a表数据插入b表_查询A表数据插入到B表中 sql
- python从入门到精通-小白如何系统学习python,从入门到精通?
- python画3d图-python之画三维图像