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自动机)相关推荐

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

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

  2. Keywords Search AC自动机QAQ

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

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

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

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

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

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

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

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

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

  7. HUD2222 Keywords Serch AC自动机

    传送门 显然这是一道AC自动机的模板题 但是还有一些地方需要注意: 1.多组数据要每次清空数组 2.关键字重复要累加,但是文本重复不能累加,可以打标记解决 #include<cstdio> ...

  8. Keywords Search HDU - 2222(AC自动机模板)

    题意: 给定 n个长度不超过 50的由小写英文字母组成的单词准备查询,以及一篇文章,问:文中出现了多少个待查询的单词.多组数据. 题目: In the modern time, Search engi ...

  9. HDU2222 Keywords Search(AC自动机模板)

    AC自动机是一种多模式匹配的算法.大概过程如下: 首先所有模式串构造一棵Trie树,Trie树上的每个非根结点都代表一个从根出发到该点路径的字符串. 然后每个结点都计算出其fail指针的值,这个fai ...

最新文章

  1. QT5界面操作3: QPainter和paintEvent(self, event)的配合
  2. 动态换ip如何实现_动态IP可以实现哪些功能及用途
  3. CUDA中并行规约(Parallel Reduction)的优化
  4. 金属,塑料,傻傻分不清楚
  5. red hat linux 虚拟机,Red Hat linux 的安装详细流程(包括VM虚拟机的设置)
  6. 北京公交将标配智能辅助驾驶,具备行人防撞、车道偏离预警
  7. python顺序查找的递归算法_Python实现查找算法
  8. yarn-cluster 和yarn-client区别
  9. 一般纳税人和小规模纳税人哪个好?哪个更划算?
  10. ITSS服务管理体系建立流程(四个阶段)附:广东软件行业协会ITSS评估
  11. 戴尔服务器虚拟光驱,SupportAssist
  12. 全面对战LILO 和 GRUB
  13. 解决尝试连接“ECONNREFUSED - 连接被服务器拒绝”失败的问题
  14. 07_音频录制01_命令行
  15. CRC16_CCITT/True的Java计算实现
  16. WPS表格 JSA-单格内,按文字颜色处理文字
  17. Java毕业设计-考试管理系统
  18. java 字符串签名_Java-方法签名
  19. 百度地图setMapStyle
  20. AST实战|AST入门与实战星球高频问题汇总(二)

热门文章

  1. C Tricks(十三)—— trim 的实现
  2. Tricks(二十五)—— decorator(在函数调用前后打印日志)
  3. 标准模板库(STL)之 map 列传 (二)
  4. C/C++ debug(一)
  5. C++基础——简单而强大的bitset
  6. linux 系统管理员面试,经典linux系统工程师系统管理员面试题
  7. linux dd命令 配额,第四章 Centos7.5下LVM操作与磁盘配额
  8. mysql 将a表数据插入b表_查询A表数据插入到B表中 sql
  9. python从入门到精通-小白如何系统学习python,从入门到精通?
  10. python画3d图-python之画三维图像