病毒侵袭持续中

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 9831    Accepted Submission(s): 3457

Problem Description
小t非常感谢大家帮忙解决了他的上一个问题。然而病毒侵袭持续中。在小t的不懈努力下,他发现了网路中的“万恶之源”。这是一个庞大的病毒网站,他有着好多好多的病毒,但是这个网站包含的病毒很奇怪,这些病毒的特征码很短,而且只包含“英文大写字符”。当然小t好想好想为民除害,但是小t从来不打没有准备的战争。知己知彼,百战不殆,小t首先要做的是知道这个病毒网站特征:包含多少不同的病毒,每种病毒出现了多少次。大家能再帮帮他吗?
 
Input
第一行,一个整数N(1<=N<=1000),表示病毒特征码的个数。
接下来N行,每行表示一个病毒特征码,特征码字符串长度在1—50之间,并且只包含“英文大写字符”。任意两个病毒特征码,不会完全相同。
在这之后一行,表示“万恶之源”网站源码,源码字符串长度在2000000之内。字符串中字符都是ASCII码可见字符(不包括回车)。
 
Output
按以下格式每行一个,输出每个病毒出现次数。未出现的病毒不需要输出。
病毒特征码: 出现次数
冒号后有一个空格,按病毒特征码的输入顺序进行输出。
 
Sample Input
3
AA
BB
CC
ooxxCC%dAAAoen....END
 
Sample Output
AA: 2
CC: 1
  1. #include<cstdio>
  2. #include<cstring>
  3. #include<queue>
  4. using namespace std;
  5. const int MAXN=;
  6. const int N=;
  7. int n;
  8. int Hash[];
  9. struct ID{
  10. char ss[];
  11. ID()
  12. {
  13. memset(ss,,sizeof(ss));
  14. }
  15. }words[];
  16. struct Trie{
  17. int next[MAXN][N],fail[MAXN],end[MAXN];
  18. int tot,root,id;
  19. int newnode()
  20. {
  21. for(int i=;i<N;i++)
  22. next[tot][i]=-;
  23. end[tot++]=;
  24. return tot-;
  25. }
  26.  
  27. void init()
  28. {
  29. tot=;
  30. root=newnode();
  31. }
  32.  
  33. void insert(char buf[],int id)
  34. {
  35. int len=strlen(buf);
  36. int now=root;
  37. for(int i=;i<len;i++)
  38. {
  39. int k=buf[i];
  40. if(next[now][k]==-)
  41. next[now][k]=newnode();
  42. now=next[now][k];
  43. }
  44. end[now]=id;
  45. }
  46.  
  47. void build()
  48. {
  49. fail[root]=root;
  50. queue<int> que;
  51. for(int i=;i<N;i++)
  52. if(next[root][i]==-)
  53. next[root][i]=root;
  54. else
  55. {
  56. fail[next[root][i]]=root;
  57. que.push(next[root][i]);
  58. }
  59.  
  60. while(!que.empty())
  61. {
  62. int now=que.front();
  63. que.pop();
  64.  
  65. for(int i=;i<N;i++)
  66. if(next[now][i]==-)
  67. next[now][i]=next[fail[now]][i];
  68. else
  69. {
  70. fail[next[now][i]]=next[fail[now]][i];
  71. que.push(next[now][i]);
  72. }
  73. }
  74. }
  75.  
  76. void query(char buf[])
  77. {
  78. int len=strlen(buf);
  79. int now=root;
  80. for(int i=;i<len;i++)
  81. {
  82. now=next[now][buf[i]];
  83. int temp=now;
  84. while(temp!=root)
  85. {
  86. if(end[temp]!=)
  87. Hash[end[temp]]++;
  88. //若每个模式串只在主串中匹配一次则加上 end[temp]=0;
  89. temp=fail[temp];
  90. }
  91. }
  92.  
  93. for(int i=;i<=n;i++)
  94. {
  95. if(Hash[i]!=)
  96. {
  97. printf("%s: %d\n",words[i].ss,Hash[i]);
  98. }
  99. }
  100. }
  101. };
  102. Trie ac;
  103. char buf[];
  104. int main()
  105. {
  106. while(scanf("%d",&n)!=EOF)
  107. {
  108. memset(Hash,,sizeof(Hash));
  109. ac.init();
  110. for(int i=;i<=n;i++)
  111. {
  112. scanf("%s",words[i].ss);
  113. ac.insert(words[i].ss,i);
  114. }
  115. ac.build();
  116. scanf("%s",buf);
  117. ac.query(buf);
  118. }
  119. return ;
  120. }

HDU3065(AC自动机入门题)的更多相关文章

  1. hdu2222 KeyWords Search AC自动机入门题

    /** 链接:http://acm.hdu.edu.cn/showproblem.php?pid=2222 题意:题意:给定N(N <= 10000)个长度不大于50的模式串,再给定一个长度为L ...

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

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

  3. hdu2896 病毒侵袭 AC自动机入门题 N(N <= 500)个长度不大于200的模式串(保证所有的模式串都不相同), M(M <= 1000)个长度不大于10000的待匹配串,问待匹配串中有哪几个模式串,

    /** 题目:hdu2896 病毒侵袭 链接:http://acm.hdu.edu.cn/showproblem.php?pid=2896 题意:N(N <= 500)个长度不大于200的模式串 ...

  4. HDU2222(AC自动机入门题)

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

  5. UVA 11468 AC自动机入门题 记忆化概率dp+ac自动机

    /** 链接:https://vjudge.net/problem/UVA-11468 详见lrj训练指南P218 我的是反向求存在模板串的概率. dp[i][j]表示当前i位置选择字符,前面i-1个 ...

  6. 【hdu2222】【poj2945】AC自动机入门题

    HDU2222 传送门 题目分析 裸题:注意构建自动机用的是模式串,思想和kmp很类似. code: #include<iostream> #include<cstdio> # ...

  7. UVALive-4670 AC自动机入门题 求出现次数最多的子串

    /** 链接:http://vjudge.net/problem/UVALive-4670 详见lrj训练指南P216 */ #include<bits/stdc++.h> using n ...

  8. HDU2896(AC自动机入门题)

    病毒侵袭 Time Limit:1000MS     Memory Limit:32768KB   Description 当太阳的光辉逐渐被月亮遮蔽,世界失去了光明,大地迎来最黑暗的时刻....在这 ...

  9. HD2222 Keywords Search(AC自动机入门题)

    然而还不是很懂=_= #include <iostream> #include <cstring> #include <algorithm> #include &l ...

随机推荐

  1. Android--绑定服务调用服务的方法

    Service依照其启动的方式,可分为两种: 1.Started Started的Service.通过在Application里用startService(Intent intent)方法来启动.这样 ...

  2. 深度探究apk安装过程

    一.先验知识 0.PcakageaManagerService版本号变化 1.概述 2.PackageManagerService服务启动流程 3. PackageManagerService入口 二 ...

  3. 在pypy环境中运行odoo8

    PyPy是一个独立的解析器, 通过即时编译(JIT,Just-in-time)代码避免逐行解释执行来提升运行速度的(将编译过的行代码缓存起来,从而加快速度).我们一般使用的Python一般是使用C实现 ...

  4. 在eclipse中查找指定文件 [多种方法]

    在eclipse中查找指定文件   1.ctrl+h打开搜索界面 File Search: containing text填*,File name patterns填写hello.*,可以找到hell ...

  5. Phalcon框架如何实现读写分离

    Phalcon框架如何实现读写分离 假设你已经在DI容器里注册了俩 db services,如下: <?php // 主库 $di->setShared('dbWrite', functi ...

  6. Swift中的switch 和 do while

    switch后面的()能够省略 OC中的switch假设没有break就会穿透(依次运行),在Swift中不会穿透(可理解默认就有break) OC中入股要在case中定义变量,必要要加上{}确定作用 ...

  7. 自动提交form表单

    <form class="form-inline" name='MD5form' method="post" action="<?php ...

  8. 【上】安全HTTPS-全面具体解释对称加密,非对称加密,数字签名,数字证书和HTTPS

    一,对称加密 所谓对称加密.就是它们在编码时使用的密钥e和解码时一样d(e=d),我们就将其统称为密钥k. 对称加解密的步骤例如以下: 发送端和接收端首先要共享同样的密钥k(即通信前两方都须要知道相应 ...

  9. cURL实现Get和Post

    1.Get请求: //初始化 $ch = curl_init(); //设置选项,包括URL curl_setopt($ch, CURLOPT_URL, "http://www.jb51.n ...

  10. tomcat安装后问题解决

      tomcat安装后问题解决 (1)tomcat无法正常启动的原因分析 JAVA_HOME 配置错误,或者没有配置 如果你的机器已经占有了8080 端口,则无法启动, 解决方法 (1) 你可以808 ...