病毒侵袭持续中

上一题是求出现多少病毒输出病毒序号,而这题输出每个病毒出现的次数。这题有字典树基础都能做出来,把叶子节点用相应的编号标记起来,匹配的时候遍历到叶子节点用一个数组把次数存起来就行了。

有了前几题的教训直接用静态树做用C++交,果然不会错!

  1. const int N=129;
  2. char str[2000001],s[1001][55],v[1001];
  3. int head,tail,cnt;
  4. struct tree
  5. {
  6. int f;
  7. tree *fail;
  8. tree *next[N];
  9. }*q[50001],*root,memory[50001];
  10. void insert(int i,char *s)
  11. {
  12. tree *p=root;
  13. while(*s!='\0')
  14. {
  15. int id=(int)(*s);
  16. if(p->next[id]==NULL) p->next[id]=&memory[cnt++];
  17. p=p->next[id];
  18. s++;
  19. }
  20. p->f=i;
  21. }
  22. void build()
  23. {
  24. root->fail=NULL;
  25. q[head++]=root;
  26. while(head!=tail)
  27. {
  28. tree *temp=q[tail++];
  29. tree *p=NULL;
  30. for(int i=0; i<N; i++)
  31. if(temp->next[i])
  32. {
  33. if(temp==root) temp->next[i]->fail=root;
  34. else
  35. {
  36. p=temp->fail;
  37. while(p!=NULL)
  38. {
  39. if(p->next[i])
  40. {
  41. temp->next[i]->fail=p->next[i];
  42. break;
  43. }
  44. p=p->fail;
  45. }
  46. if(p==NULL) temp->next[i]->fail=root;
  47. }
  48. q[head++]=temp->next[i];
  49. }
  50. }
  51. }
  52. void find(char *s)
  53. {
  54. tree *p=root;
  55. int ans=0;
  56. while(*s!='\0')
  57. {
  58. int id=(int)(*s);
  59. while(p->next[id]==NULL&&p!=root) p=p->fail;
  60. p=p->next[id];
  61. p=p==NULL?root:p;
  62. tree *temp=p;
  63. while(temp!=root)
  64. {
  65. if(temp->f) v[temp->f]++;
  66. temp=temp->fail;
  67. }
  68. s++;
  69. }
  70. }
  71. int main()
  72. {
  73. int n;
  74. while(~scanf("%d",&n))
  75. {
  76. memset(memory,0,sizeof(memory));
  77. memset(v,0,sizeof(v));
  78. cnt=head=tail=0;
  79. root=&memory[cnt++];
  80. for(int i=1; i<=n; i++)
  81. {
  82. scanf("%s",s[i]);
  83. insert(i,s[i]);
  84. }
  85. build();
  86. scanf("%s",str);
  87. find(str);
  88. for(int i=1; i<=n; i++)
  89. if(v[i]) printf("%s: %d\n",s[i],v[i]);
  90. }
  91. return 0;
  92. }

HDU-3065 病毒侵袭持续中 AC自动机又是一板子!的更多相关文章

  1. HDU 3065 病毒侵袭持续中 (AC自动机)

    题目链接 Problem Description 小t非常感谢大家帮忙解决了他的上一个问题.然而病毒侵袭持续中.在小t的不懈努力下,他发现了网路中的"万恶之源".这是一个庞大的病毒 ...

  2. hdoj 3065 病毒侵袭持续中(AC自动机)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3065 思路分析:问题需要模式匹配多个模式串,需要注意的是模式串会包含和重叠,需要对AC自动机的匹配过 ...

  3. HDU 3065 病毒侵袭持续中

    HDU 3065 病毒侵袭持续中 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  4. hdu 3065 病毒侵袭持续中【AC自动机】

    <题目链接> 题目大意: 小t非常感谢大家帮忙解决了他的上一个问题.然而病毒侵袭持续中.在小t的不懈努力下,他发现了网路中的“万恶之源”.这是一个庞大的病毒网站,他有着好多好多的病毒,但是 ...

  5. HDU 3065 病毒侵袭持续中(AC自己主动机)

    题目链接:http://acm.hdu.edu.cn/showproblem.php? pid=3065 Problem Description 小t非常感谢大家帮忙攻克了他的上一个问题.然而病毒侵袭 ...

  6. hdu3065 病毒侵袭持续中 AC自动机入门题 N(N <= 1000)个长度不大于50的模式串(保证所有的模式串都不相同), 一个长度不大于2000000的待匹配串,求模式串在待匹配串中的出现次数。

    /** 题目:hdu3065 病毒侵袭持续中 链接:http://acm.hdu.edu.cn/showproblem.php?pid=3065 题意:N(N <= 1000)个长度不大于50的 ...

  7. hdu----(3065)病毒侵袭持续中(AC自动机)

    病毒侵袭持续中 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Sub ...

  8. hdu 3065病毒侵袭持续中

    病毒侵袭持续中 http://acm.hdu.edu.cn/showproblem.php?pid=3065 Time Limit: 2000/1000 MS (Java/Others)    Mem ...

  9. HDU 3065 病毒侵袭持续中 (模板题)

    病毒侵袭持续中 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Sub ...

随机推荐

  1. [问题记录]Java关于可变参数重载问题的测试

    突然发现java的可变参数重载是存在歧义的,只是不知道java内部是怎么处理的,特意做如下实验: 测试代码如下: /** * Created by ieayoio on 16-3-1. */ publ ...

  2. 基于Servlet+smartUpload的文件上传

    文件上传在web应用中是非常常见的,现在我就介绍下基于servlet的文件上传,基于Struts2的文件上传可以看: 页面端代码: <%@ page language="java&qu ...

  3. BootStrap的基本使用

    bootstrap 现成的css样式,直接调用类作用是快速写出页面又称UI框架Bootstrap中文网LESS是预处理器CSS预处理器定义了一种新的语言,基本的思想是用一种专门的编程语言,开发者只需要 ...

  4. 【笨办法学Python】习题11:打印出改变了的输入

    print "How old are you?", age = raw_input() print "How tall are you?", height = ...

  5. Android学习总结(十六) ———— MediaPlayer播放音频与视频

    一.基本概念 本文主要介绍的是Android中很重要也最为复杂的媒体播放器(MediaPlayer)部分的架构.Android的MediaPlayer包含了Audio和video的播放功能,在Andr ...

  6. search bar 自定义背景

    //修改搜索框背景 self.searchCarKeyWord.backgroundColor=[UIColorclearColor]; //去掉搜索框背景 //1. [[self.searchCar ...

  7. k8s 如何 Failover?

    上一节我们有 3 个 nginx 副本分别运行在 k8s-node1 和 k8s-node2 上.现在模拟 k8s-node2 故障,关闭该节点. 等待一段时间,Kubernetes 会检查到 k8s ...

  8. webpack devserver的说明

    一般我们在项目中 如果用webpack的话,基本都会用到webpack-dev-server,配置大致如下: devServer={ contentBase: basePath, historyApi ...

  9. Catalan 数

    概要 在一些面试的智力题中会遇到此数的变形,如果完全不了解,直接想结果是很困难的,故在此简单介绍一下.   基本定义 Catalan 数的定义根据不同的应用环境有很多不同的定义方式,下面给出一个.   ...

  10. Mac如何让调整窗口大小更简单

    在使用Mac的时候,你能把鼠标的光标悬停在任何程序的边缘,当光标自动变成箭头样式后,按住鼠标左键你将能随意拖动来改变程序窗口的大小.但是,这里有个问题,我们有时候很难控制把鼠标光标移动在正确的窗口边缘 ...