题目链接:https://cn.vjudge.net/problem/HDU-3065

题意

跟上一道题是几乎一模一样,这次是统计关键词的出现次数

一个相当坑的地方,注意多组样例

思路

套模版

改insert方法,这次我们指定每个关键词的idx

改query方法,统计value_counter(话说最近几天在用pandas,value_counts确实方便)

提交过程

WA*n 注意多组样例
WA 注意用128大小的分支,用26个同时判断待匹配串的话会WA?
AC

代码

  1. #include <map>
  2. #include <queue>
  3. #include <cstdio>
  4. #include <string>
  5. #include <cstring>
  6. using namespace std;
  7. const int maxn=1000+20, maxw=50+20, maxl=2000000+20;
  8. const int ACSize=maxn*maxw, maxitem=128;
  9. char word[maxw], line[maxl];
  10. map<int, string> tostr;
  11. struct ACauto{
  12. int next[ACSize][maxitem], fail[ACSize], cnt[ACSize];
  13. int root, total;
  14. int newnode(void){
  15. for(int pos=0; pos<maxitem; pos++)
  16. next[total][pos]=-1;
  17. cnt[total]=0;
  18. return total++;
  19. }
  20. void init(void){
  21. total=0;
  22. root=newnode();
  23. }
  24. int getPos(char ch){
  25. return ch;
  26. }
  27. void insert(char buf[], int idx){
  28. int now=root;
  29. for(int i=0; buf[i]; i++){
  30. int pos=getPos(buf[i]);
  31. if(next[now][pos]==-1)
  32. next[now][pos]=newnode();
  33. now=next[now][pos];
  34. }
  35. cnt[now]=idx; //++itemCounter;
  36. }
  37. void build(void){
  38. queue<int> que;
  39. fail[root]=root;
  40. for(int i=0; i<maxitem; i++)
  41. if(next[root][i]==-1)
  42. next[root][i]=root;
  43. else{
  44. fail[next[root][i]]=root;
  45. que.push(next[root][i]);
  46. }
  47. while(!que.empty()){
  48. int now=que.front(); que.pop();
  49. for(int pos=0; pos<maxitem; pos++)
  50. if(next[now][pos]==-1)
  51. next[now][pos]=next[fail[now]][pos];
  52. else{
  53. fail[next[now][pos]]=next[fail[now]][pos];
  54. que.push(next[now][pos]);
  55. }
  56. }
  57. }
  58. void query(char buf[], int counter[]){
  59. int now=root;
  60. for(int i=0; buf[i]; i++){
  61. int pos=getPos(buf[i]);
  62. // if (pos<0 || pos>=maxitem){pos=root; continue;}
  63. now=next[now][pos];
  64. for (int tmp=now; tmp!=root; tmp=fail[tmp]) if (cnt[tmp])
  65. counter[cnt[tmp]]++;
  66. }
  67. }
  68. }AC;
  69. int main(void){
  70. int m, n;
  71. while (scanf("%d", &n)==1 &&n){
  72. AC.init();
  73. for (int i=1; i<=n; i++){
  74. scanf("%s", word);
  75. AC.insert(word, i);
  76. tostr[i]=string(word);
  77. }AC.build();
  78. int counter[maxn]={0};
  79. scanf("%s", line);
  80. AC.query(line, counter);
  81. for (int i=1; i<=n; i++) if (counter[i])
  82. printf("%s: %d\n", tostr[i].c_str(), counter[i]);
  83. }
  84. return 0;
  85. }
Time Memory Length Lang Submitted
234ms 18004kB 2417 C++ 2018-08-02 17:39:24

HDU-3065 病毒侵袭持续中 字符串问题 AC自动机的更多相关文章

  1. HDU 3065 病毒侵袭持续中

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

  2. hdu 3065病毒侵袭持续中

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

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

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

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

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

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

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

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

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

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

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=3065 中文题题意不解释了. 依旧稍微改一下ac自动机模版就能过了.还有一个坑点!是多组数据!!! #i ...

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

    这题数据太水,一开始没有加上Get的方法也能AC..话说AC自动机中一定要注意加上Get的方法!(不然,同一个后缀的其他单词就没被算上了.) 代码如下: #include <stdio.h> ...

  9. HDU 3065 病毒侵袭持续中(AC自动机(每个模式串出现次数))

    http://acm.hdu.edu.cn/showproblem.php?pid=3065 题意:求每个模式串出现的次数. 思路: 不难,把模板修改一下即可. #include<iostrea ...

随机推荐

  1. 陆、jq基础语法

    一.概述:更加方便的处理html文档.events事件.动画效果和ajax交互等. 1.jq主要功能: (1)访问页面框架的局部. (2)修改页面表现 (3)更改页面的内容 (4)响应事件 (5)为页 ...

  2. 阿里云数据库MySQL版快速上手!

    MySQL是全球最受欢迎的开源数据库,其在各Web应用中均有广泛部署.阿里云数据库MySQL版基于Alibaba的MySQL源码分支,经过双11高并发.大数据量的考验,拥有优良的性能和吞吐量.除此之外 ...

  3. JS对以对象组成的数组去重

    这是从https://segmentfault.com/q/1010000006954351参考的,达到了我要去重的功能!!! var hash = {};//arr是要去重的对象数组 arr = a ...

  4. virtualenv和virtualenvwrapper的安装与使用

    环境 Windows 10 python 3.6.7 virtualenv 安装 virtualenv用于创建虚拟环境,用于隔离不同的python版本的运行,是容器类软件.这里在Windows下通过p ...

  5. (5)pyspark----共享变量

    如果想在节点之间共享一份变量,spark提供了两种特定的共享变量,来完成节点之间的变量共享. (1)广播变量(2)累加器 二.广播变量 概念: 广播变量允许程序员缓存一个只读的变量在每台机器上,而不是 ...

  6. adb 相关问题总结

    1. adb shell权限问题$ su //root权限来启动adb server$ adb kill-server && adb start-server* daemon not ...

  7. jquery中的jsonp跨域调用

                                                    jquery jsonp跨域调用接口

  8. Sublime Text 3 Package Control安装

    本系列文章由 @yhl_leo 出品,转载请注明出处. 文章链接: http://blog.csdn.net/yhl_leo/article/details/50618314 安装好Sublime T ...

  9. 一个简单搜索引擎的搭建过程(Solr+Nutch+Hadoop)

    最近,因为未来工作的需要,我尝试安装部署了分布式爬虫系统Nutch,并配置了伪分布式的Hadoop来存储爬取的网页结果,用solr来对爬下来的网页进行搜索.我主要通过参考网上的相关资料进行安装部署的. ...

  10. 讲一讲java异常及自定义异常

    1.异常,说白了.两种,一种就是就是不能让代码通过编译的异常.另一种就是程序运行期间出现的异常.异常就是错误,只要出现异常,程序就不会向下运行了.就不会执行后面的代码了.这时候就可以通过显示statc ...