题意:就是求目标串中出现了几个模式串。

思路:用int型的end数组记录出现,AC自动机即可。

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<cmath>
  5. #include<string>
  6. #include<algorithm>
  7. #include<queue>
  8. #define maxn 500005
  9. int T,n;
  10. char s[];
  11. struct Trie{
  12. int root,L;
  13. int next[maxn][],fail[maxn],end[maxn];
  14. int newnode(){
  15. for (int i=;i<;i++)
  16. next[L][i]=-;
  17. end[L++]=;
  18. return L-;
  19. }
  20. void clear(){
  21. L=;root=newnode();
  22. }
  23. void insert(char s[]){
  24. int now=root,len=strlen(s);
  25. for (int i=;i<len;i++){
  26. if (next[now][s[i]-'a']==-) next[now][s[i]-'a']=newnode();
  27. now=next[now][s[i]-'a'];
  28. }
  29. end[now]++;
  30. }
  31. void build(){
  32. std::queue<int>Q;
  33. int now=root;
  34. for (int i=;i<;i++)
  35. if (next[now][i]==-) next[now][i]=root;
  36. else
  37. fail[next[now][i]]=root,Q.push(next[now][i]);
  38. while (!Q.empty()){
  39. int now=Q.front();
  40. Q.pop();
  41. for (int i=;i<;i++){
  42. if (next[now][i]==-)
  43. next[now][i]=next[fail[now]][i];
  44. else{
  45. fail[next[now][i]]=next[fail[now]][i];
  46. Q.push(next[now][i]);
  47. }
  48. }
  49. }
  50. }
  51. int query(char s[]){
  52. int now=root,len=strlen(s),res=;
  53. for (int i=;i<len;i++){
  54. now=next[now][s[i]-'a'];
  55. int tmp=now;
  56. while (tmp!=root){
  57. res+=end[tmp];
  58. end[tmp]=;
  59. tmp=fail[tmp];
  60. }
  61. }
  62. return res;
  63. }
  64. }ac;
  65. int main(){
  66. scanf("%d",&T);
  67. while (T--){
  68. scanf("%d",&n);
  69. ac.clear();
  70. for (int i=;i<n;i++){
  71. scanf("%s",s);
  72. ac.insert(s);
  73. }
  74. ac.build();
  75. scanf("%s",s);
  76. printf("%d\n",ac.query(s));
  77. }
  78. }

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

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

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

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

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

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

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

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

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

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

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

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

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

  7. hdoj 2222 Keywords Search(AC自动机)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2222 思路分析:该问题为多模式匹配问题,使用AC自动机解决:需要注意的问题是如何统计该待查询的字符串包 ...

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

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

  9. HDU 2222 Keywords Search AC自己主动机入门题

    单词统计的题目,给出一些单词,统计有多少单词在一个文本中出现,最经典的入门题了. AC自己主动机的基础: 1 Trie. 以这个数据结构为基础的,只是添加一个fail指针和构造fail的函数 2 KM ...

随机推荐

  1. Codeforces 566F Clique in the Divisibility Graph

    http://codeforces.com/problemset/problem/566/F 题目大意: 有n个点,点上有值a[i], 任意两点(i, j)有无向边相连当且仅当 (a[i] mod a ...

  2. Altium Designer规则

    1.PCB规则 是PCB设计中至关重要的一个环节:保证PCB符合电气要求.机械加工(精度)要求:为自动布局.布线和部分手动布局.布线操作提供依据 为规则检查提供依据,PCB编辑期间,AD会实时地进行一 ...

  3. 一些pyhon的学习资料

    一直没有时间学习python,都说python语法简洁优美.但是我看它的语法还是不爽啊,没C/C++好阅读.但是C/C++又必须了解底层的计算机模型.着实会门槛高一些.特别是C++,对于我来说简直就是 ...

  4. cv:显示Linux命令运行进度

    cv: 显示 cp.mv 等命令的进度 2014-07-14 By toy Posted in Apps Edit on GitHub 在 Linux 系统中 , 大多数命令从来都是信奉 “ 沉默是金 ...

  5. 第26讲 对话框AlertDialog的自定义实现

    第26讲对话框AlertDialog的自定义实现 比如我们在开发过长当中,要通过介绍系统发送的一个广播弹出一个dialog.但是dialog必需是基于activity才能呈现出来,如果没有activi ...

  6. (转)Android中截取当前屏幕图片

    该篇文章是说明在Android手机或平板电脑中如何实现截取当前屏幕的功能,并把截取的屏幕保存到SDCard中的某个目录文件夹下面.实现的代码如下: /** * 获取和保存当前屏幕的截图 */ priv ...

  7. Java小项目--坦克大战(version1.0)

    Java小项目--坦克大战<TankWar1.0> 这个小项目主要是练习j2se的基础内容和面向对象的思想.项目实现了基本的简单功能,我方一辆坦克,用上下左右键控制移动方向,按F键为发射炮 ...

  8. Multithreading: How to Use the Synchronization Classes

    (Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu 转载请标明来源) 翻译文章来源:  msdn - Multithreading: How to Use t ...

  9. gnuplot常用技巧

      一.         基础篇: 在linux命令提示符下运行gnuplot命令启动,输入quit或q或exit退出. 1.plot命令 gnuplot> plot sin(x) with l ...

  10. [置顶] ./build_native 时出现please define NDK_ROOT

    在一次帮朋友弄cygwin交叉编译时出现了这个问题 cygwin是按照成功了,make-v,以及gcc-v都没出现问题,就是在./build_native 时出现please define NDK_R ...