http://acm.hdu.edu.cn/showproblem.php?pid=2222

KMP是单模式串匹配的算法,而AC自动机是用于多模式串匹配的算法。主要由Trie和KMP的思想构成。

题意:输入N个模式串,再给出一个文本串,求文本串里出现的模式串数目。

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <cmath>
  4. #include <cstdlib>
  5. #include <algorithm>
  6. #include <string>
  7. #include <iostream>
  8. #include <stack>
  9. #include <map>
  10. #include <queue>
  11. using namespace std;
  12. #define N 500001
  13. /*
  14. 一个模式串的某个字符匹配失败的时候,就跳到它的失败指针上继续匹配,重复上述操作,直到这个字符匹配成功,所以失败指针一定满足一个性质,它指向的一定是某个串的前缀,并且这个前缀是当前结点所在前缀的后缀,而且一定是最长后缀。
  15. */
  16. struct Ac_DFA
  17. {
  18. int next[N][]; //一开始这里用了char结果MLE
  19. int val[N], size, root, fail[N];
  20.  
  21. int creat() { //构造新节点
  22. for(int i = ; i < ; i++) {
  23. next[size][i] = -;
  24. }
  25. val[size] = ;
  26. return size++;
  27. }
  28.  
  29. void init() {
  30. size = ;
  31. root = creat();
  32. }
  33.  
  34. void insert(char s[]) { //插入模式串
  35. int len = strlen(s);
  36. int now = root;
  37. for(int i = ; i < len; i++) {
  38. int c = s[i] - 'a';
  39. if(next[now][c] == -) {
  40. next[now][c] = creat();
  41. }
  42. now = next[now][c];
  43. }
  44. val[now]++;
  45. }
  46.  
  47. void build() { //构造fail函数
  48. queue<int> que;
  49. while(!que.empty()) que.pop();
  50. for(int i = ; i < ; i++) { //初始化
  51. if(next[root][i] == -) { //如果没有边就补上去
  52. next[root][i] = root;
  53. } else {
  54. fail[next[root][i]] = root; //有边的话第一个结点指向root
  55. que.push(next[root][i]);
  56. }
  57. }
  58. while(!que.empty()) {
  59. int now = que.front(); que.pop();
  60. for(int i = ; i < ; i++) {
  61. if(next[now][i] == -) {
  62. next[now][i] = next[fail[now]][i]; //如果没有边构造一条边出来
  63. // 构造的边是fail指针指向的节点的出边
  64. } else {
  65. fail[next[now][i]] = next[fail[now]][i]; //有边fail就指向与目前的相同结点(以目前匹配的串的最长后缀为前缀)的一条边
  66. que.push(next[now][i]);
  67. }
  68. }
  69. }
  70. }
  71.  
  72. int query(char s[]) {
  73. int len = strlen(s);
  74. int ans = ;
  75. int now = root;
  76. for(int i = ; i < len; i++) {
  77. now = next[now][s[i] - 'a'];
  78. int tmp = now;
  79. while(tmp != root) {
  80. ans += val[tmp];
  81. val[tmp] = ;
  82. tmp = fail[tmp]; // KMP思想:当前匹配失败,沿着失配边走看有没有能够匹配的串
  83. }
  84. }
  85. return ans;
  86. }
  87. };
  88.  
  89. char s[];
  90. Ac_DFA ac;
  91.  
  92. int main()
  93. {
  94. int t;
  95. scanf("%d", &t);
  96. while(t--) {
  97. int n;
  98. scanf("%d", &n);
  99. ac.init();
  100. for(int i = ; i < n; i++) {
  101. scanf("%s", s);
  102. ac.insert(s);
  103. }
  104. ac.build();
  105. scanf("%s", s);
  106. int ans = ac.query(s);
  107. printf("%d\n", ans);
  108. }
  109. return ;
  110. }

HDU 2222:Keywords Search(AC自动机模板)的更多相关文章

  1. hdu 2222 Keywords Search ac自动机模板

    题目链接 先整理一发ac自动机模板.. #include <iostream> #include <vector> #include <cstdio> #inclu ...

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

    学习AC自动机请戳这里:大神blog........ 自动机的模板: #include <iostream> #include <algorithm> #include < ...

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

    <题目链接> 题目大意: 给你一些单词,和一个字符串,问你这个字符串中含有多少个上面的单词. 解题分析: 这是多模匹配问题,如果用KMP的话,对每一个单词,都跑一遍KMP,那么当单词数量非 ...

  4. hdu 2222 Keywords Search——AC自动机

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=2222 第一道AC自动机! T了无数边后终于知道原来它是把若干询问串建一个自动机,把模式串放在上面跑:而且只 ...

  5. hdu 2222 Keywords Search ac自动机入门

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2222 题意:有N(N <= 10000)个长度不超过50的模式串和一个长度不超过1e6的文本串. ...

  6. HDU 2222 Keywords Search (AC自动机)

    题意:就是求目标串中出现了几个模式串. 思路:用int型的end数组记录出现,AC自动机即可. #include<iostream> #include<cstdio> #inc ...

  7. Match:Keywords Search(AC自动机模板)(HDU 2222)

    多模匹配 题目大意:给定很多个字串A,B,C,D,E....,然后再给你目标串str字串,看目标串中出现多少个给定的字串. 经典AC自动机模板题,不多说. #include <iostream& ...

  8. POJ2222 Keywords Search AC自动机模板

    http://acm.hdu.edu.cn/showproblem.php?pid=2222 题意:给出一些单词,求多少个单词在字符串中出现过(单词表单词可能有相同的,这些相同的单词视为不同的分别计数 ...

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

    Keywords Search Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others ...

  10. hdu 2222 Keywords Search - Aho-Corasick自动机

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

随机推荐

  1. leetcode8 String to Integer (atoi)

    题目需求: 输入一个字符串,输出对应的int值 特殊处理: 输入: null  输出:0 输入: "a122"  输出:0 输入: "   1233"  输出: ...

  2. eclipse Project facet Java version 1.8 is not supported.

    在移植eclipse项目时,如果遇到 “Project facet Java version 1.7 is not supported.” 项目中的jdk1.7不支持.说明项目是其他版本jdk编译的, ...

  3. PostgreSQL单机、同步复制、异步复制性能测试对比

    测试环境: •测试机:PC •内存:8GB •CPU:Intel(R) Core(TM) i5-3450 3.10GHz •硬盘:HDD •数据量:20GB •测试工具:pgbench •Postgr ...

  4. C++(VS2012)DLL动态库的生成和调用

    DLL动态链接库的生成: 首先打开VS2012,新建——项目——Win32控制台应用程序(项目名称:ConsoleApplication1)——空项目 新建一个源文件source.cpp 先用控制台e ...

  5. 【Origin】工仕途中

    -脚步翩跹,随蝶起舞,翩翩不知所往 晨起脚步催, 蝴蝶迎面飞; 正是春意浓, 三月好风景. -作于二零一六年三月二十八日

  6. 大数据Spark超经典视频链接全集

    论坛贴吧等信息发布参考模板 Scala.Spark史上最全面.最详细.最彻底的一整套视频全集(特别是机器学习.Spark Core解密.Spark性能优化.Spark面试宝典.Spark项目案例等). ...

  7. UML: 部署图

    说部署图之前,先看看某24小时便利店管理系统的网络拓扑结构图: 这个图描述了本系统的整体物理结构,从该图我们可以得到以下信息:1.该便利店集团有总部和多个门店,总部管理财务.仓库.采购等事宜.2.二级 ...

  8. demo16Toast

    /Users/alamps/AndroidStudioProjects/demo16Toast/demo16Toast/src/main/res/layout/activity_main.xml &l ...

  9. C main

    #include <stdio.h> int main(int argv, char* argc[]) { printf("argv is %d", argv); // ...

  10. [转]]将 ASP.NET MVC3 Razor 项目部署到虚拟主机中

    原链接:http://www.cnblogs.com/taven/archive/2011/08/14/2138077.html 国内很多网站空间都只支持.NET 2.0 和 .NET 3.0 3.5 ...