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

一个AC自动机的模板题。用的kuangbin的模板,静态建Trie树。可能遇到MLE的情况要转动态建树。

AC自动机的讲解看这里

http://blog.csdn.net/niushuai666/article/details/7002823

http://blog.csdn.net/mobius_strip/article/details/22549517

  1. /*--------------------------------------------------------------------------------------*/
  2. // Helica's header
  3. // Second Editions
  4. // 2015.11.7
  5. //
  6. #include <algorithm>
  7. #include <iostream>
  8. #include <cstring>
  9. #include <ctype.h>
  10. #include <cstdlib>
  11. #include <cstdio>
  12. #include <vector>
  13. #include <string>
  14. #include <queue>
  15. #include <stack>
  16. #include <cmath>
  17. #include <set>
  18. #include <map>
  19.  
  20. //debug function for a N*M array
  21. #define debug_map(N,M,G) printf("\n");for(int i=0;i<(N);i++)\
  22. {for(int j=;j<(M);j++){\
  23. printf("%d",G[i][j]);}printf("\n");}
  24. //debug function for int,float,double,etc.
  25. #define debug_var(X) cout<<#X"="<<X<<endl;
  26. /*--------------------------------------------------------------------------------------*/
  27. using namespace std;
  28.  
  29. int N,M,T;
  30.  
  31. struct Trie
  32. {
  33. int next[][],fail[],end[];
  34. int root,L;
  35. int newnode()
  36. {
  37. for(int i=;i<;i++) next[L][i] = -;
  38. end[L++] = ;
  39. return L-;
  40. }
  41. void init()
  42. {
  43. L = ;
  44. root = newnode();
  45. }
  46.  
  47. void insert(char *s)
  48. {
  49. int len = strlen(s);
  50. int now = root;
  51. for(int i=;i<len;i++)
  52. {
  53. if(next[now][s[i]-'a'] == -)
  54. next[now][s[i]-'a'] = newnode();
  55. now = next[now][s[i]-'a'];
  56. }
  57. end[now]++;
  58. }
  59.  
  60. void build()
  61. {
  62. queue <int> Q;
  63. fail[root] = root;
  64. for(int i=;i<;i++)
  65. if(next[root][i] == -)
  66. next[root][i] = root;
  67. else
  68. {
  69. fail[next[root][i]] = root;
  70. Q.push(next[root][i]);
  71. }
  72.  
  73. while(!Q.empty())
  74. {
  75. int now = Q.front();
  76. Q.pop();
  77. for(int i=;i<;i++)
  78. {
  79. if(next[now][i] == -)
  80. next[now][i] = next[fail[now]][i];
  81. else
  82. {
  83. fail[next[now][i]] = next[fail[now]][i];
  84. Q.push(next[now][i]);
  85. }
  86. }
  87. }
  88.  
  89. }
  90.  
  91. int query(char *s)
  92. {
  93. int len = strlen(s);
  94. int now = root;
  95. int ans = ;
  96. for(int i=;i<len;i++)
  97. {
  98. now = next[now][s[i]-'a'];
  99. int temp = now;
  100. while(temp != root)
  101. {
  102. ans += end[temp];
  103. end[temp] = ;
  104. temp = fail[temp];
  105. }
  106. }
  107. return ans;
  108. }
  109. void debug()
  110. {
  111. for(int i=;i<L;i++)
  112. {
  113. printf("id = %3d,fail = %3d,end = %3d,chi = [",i,fail[i],end[i]);
  114. for(int j=;j<;j++)
  115. printf("%2d",next[i][j]);
  116. printf("]\n");
  117. }
  118. }
  119. };
  120.  
  121. char buf[];
  122. Trie ac;
  123.  
  124. int main()
  125. {
  126. scanf("%d",&T);
  127. while(T--)
  128. {
  129. ac.init();
  130. scanf("%d",&N);
  131. for(int i=;i<N;i++)
  132. {
  133. scanf("%s",buf);
  134. ac.insert(buf);
  135. }
  136. ac.build();
  137. //ac.debug();
  138. scanf("%s",buf);
  139. printf("%d\n",ac.query(buf));
  140. }
  141. }

第N次入门AC自动机。。。成功。。。

AC自动机-HDU2222-模板题的更多相关文章

  1. AC自动机-HDU2896-模板题

    http://acm.hdu.edu.cn/showproblem.php?pid=2896 另一道AC自动机的模板题,不过这题需要记录一下具体的匹配情况. /*------------------- ...

  2. hdu 3695:Computer Virus on Planet Pandora(AC自动机,入门题)

    Computer Virus on Planet Pandora Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 256000/1280 ...

  3. [hdu2222]ac自动机(模板)

    题意:一个文本串+多个模板串的匹配问题 思路:裸的ac自动机. #pragma comment(linker, "/STACK:10240000,10240000") #inclu ...

  4. AC自动机 (模板)

    AC自动机是用来干什么的: AC自动机是用来解决多模匹配问题,例如有单词s1,s2,s3,s4,s5,s6,问:在文本串ss中有几个单词出现过,类似. AC自动机实现这个功能需要三个部分: 1.将所有 ...

  5. AC自动机及其模板

    模板 #include<queue> #include<stdio.h> #include<string.h> using namespace std; ; ; ; ...

  6. AC自动机(模板+例题)

    首先要明白AC自动机是干什么的: AC自动机其实就是一种多模匹配算法,那么你可能会问什么叫做多模匹配算法.下面是我对多模匹配的理解,与多模与之对于的是单模,单模就是给你一个单词,然后给你一个字符串,问 ...

  7. HDOJ-3065(AC自动机+每个模板串的出现次数)

    病毒侵袭持续中 HDOJ-3065 第一个需要注意的是树节点的个数也就是tree的第一维需要的空间是多少:模板串的个数*最长模板串的长度 一开始我的答案总时WA,原因是我的方法一开始不是这样做的,我是 ...

  8. AC自动机-HDU3065-简单题

    http://acm.hdu.edu.cn/showproblem.php?pid=3065 需要记录匹配情况的AC自动机,没有清空一些数组导致wa了几发. /*------------------- ...

  9. luogu AC自动机(模板)

    完全忘了AC自动机怎么写了qwq,更别说AC自动机上DP了. 今天就好好地学习字符串好了qwq 提一下AC自动机的时间复杂度--设n是模式串的个数,m是文本串的长度,l是模式串的平均长度,那么它的时间 ...

随机推荐

  1. 最近开始学习Cesium,学习学习。

    最近开始学习Cesium,学习学习.

  2. 如何修改Oracle服务IP地址

    oracle数据库所在的机器更改IP地址后,发现无法连接,解决这个问题,需要修改一下对应的文件: F:\app\zhaohe\product\11.2.0\dbhome_1\NETWORK\ADMIN ...

  3. Ajax获取 Json文件提取数据

    摘自 Ajax获取 Json文件提取数据 1. json文件内容(item.json) [ { "name":"张国立", "sex":&q ...

  4. 【转】单KEY业务,数据库水平切分架构实践

    本文将以“用户中心”为例,介绍“单KEY”类业务,随着数据量的逐步增大,数据库性能显著降低,数据库水平切分相关的架构实践: 如何来实施水平切分 水平切分后常见的问题 典型问题的优化思路及实践 一.用户 ...

  5. 轻量级WebApi请求插件:PostMan

    时间很宝贵,废话不多说,只说三句,如下: 十年河东,十年河西,莫欺骚年穷!~_~ 打错个字,应该是莫欺少年穷! 学历代表你的过去,能力代表你的现在,学习代表你的将来. 学无止境,精益求精. 本次介绍的 ...

  6. java.lang.IllegalStateException: Failed to load property source from location 'classpath:/application-dev.yml'

    如果你的项目没有配置错误,配置文件名称也正常,还出现这个问题,那一定是你的yml文件编码的问题 先附上一张项目架构图 当我启动服务器寻找配置文件的时候,服务器提示这样的错误信息 java.lang.I ...

  7. Mysql读写分离方案-Amoeba环境部署记录

    Mysql的读写分离可以使用MySQL Proxy,也可以使用Amoeba.Amoeba(变形虫)项目是一个类似MySQL Proxy的分布式数据库中间代理层软件,是由陈思儒开发的一个开源的java项 ...

  8. Spring RPC 入门学习(1)-HelloWorld入门

    Spring搭建RPC环境 第一,下载所需要的jar包,下载地址:https://yunpan.cn/cPErQeANrSMyB (提取码:63e5),见下图: 第二,新建动态WebProject,把 ...

  9. require.ensure的用法;异步加载-代码分割;

    webpack异步加载的原理 webpack ensure相信大家都听过.有人称它为异步加载,也有人说做代码切割,那这 个家伙到底是用来干嘛的?其实说白了,它就是把js模块给独立导出一个.js文件的, ...

  10. react/React Native 在 import 导入时,有的带花括号{},有的不带原理解析

    在使用import引用模块时,如何正确使用{} 例如:有两个文件,home.js.user.js 一:不使用{}: 当需要在home.js中引入user.js的时候 //home.js 文件中impo ...