这题模板题.............但是竟然要去重........调试了半天才发现....................

  1. #include <cstdio>
  2. #include <iostream>
  3. #include <cstring>
  4. #include <cmath>
  5. #include <algorithm>
  6. using namespace std;
  7.  
  8. struct trie {
  9. trie *next[128];
  10. int flag;
  11. int num;
  12. trie *fail;
  13. trie() {
  14. fail = NULL;
  15. flag = num = 0;
  16. memset(next,0,sizeof(next));
  17. }
  18. }*q[511111];
  19.  
  20. trie *rt = new trie();
  21. int vi[555],cnt,head,tail;
  22. char keyword[222];
  23. char book[11111];
  24.  
  25. void insert(char *key,int num) {
  26. trie *p = rt;
  27. while(*key) {
  28. int t = int(*key);
  29. if(p->next[t] == NULL) p->next[t] = new trie();
  30. p = p->next[t];
  31. key ++;
  32. }
  33. p->flag = 1;
  34. p->num = num;
  35. }
  36.  
  37. void bfs() {
  38. rt->fail = NULL;
  39. head = tail = 0;
  40. q[head++] = rt;
  41. while(head != tail) {
  42. trie *t = q[tail++];
  43. trie *tmp = NULL;
  44. for(int i=0; i<128; i++) {
  45. if(t->next[i] != NULL) {
  46. if(t == rt ) t->next[i]->fail = rt;
  47. else {
  48. tmp = t->fail; //沿着父亲的fail指针走
  49. while(tmp != NULL) {
  50. if(tmp->next[i] != NULL) {
  51. t->next[i]->fail = tmp->next[i];
  52. break;
  53. }
  54. tmp = tmp->fail;
  55. }
  56. if(tmp == NULL) t->next[i]->fail = rt;
  57. }
  58. q[head++] = t->next[i];
  59. }
  60. }
  61. }
  62. }
  63.  
  64. void query(char *key) {
  65. trie *p = rt;
  66. cnt = 0;
  67. int ok = 0;
  68. while(*key) {
  69. int t = int(*key);
  70. while(p != rt && p->next[t] == NULL) p = p->fail;
  71. p = p->next[t];
  72. if(p == NULL) p = rt;
  73. trie *tmp = p;
  74. while(tmp != rt && tmp->flag != 0) {
  75. vi[cnt] = tmp->num;
  76. cnt += tmp->flag;
  77. tmp = tmp->fail;
  78. }
  79. key++;
  80. }
  81. }
  82. int main() {
  83. int n,m;
  84. cin >> n;
  85. getchar();
  86. for(int i=0; i<n; i++) {
  87. gets(keyword);
  88. insert(keyword,i+1);
  89. }
  90. bfs();
  91. int ans = 0;
  92. cin >> m;
  93. getchar();
  94. for(int i=1; i<=m; i++) {
  95. gets(book);
  96. memset(vi,0,sizeof(vi));
  97. cnt = 0;
  98. query(book);
  99. if(cnt != 0) {
  100. ans ++;
  101. printf("web %d:",i);
  102. sort(vi,vi+cnt);
  103. int dd = unique(vi , vi + cnt) - vi;
  104. for(int j=0; j<dd; j++) printf(" %d",vi[j]);
  105. puts("");
  106. }
  107. }
  108. printf("total: %d\n",ans);
  109. return 0;
  110. }

HDU 2896 病毒侵袭 (AC自动机)的更多相关文章

  1. hdu 2896 病毒侵袭 ac自动机

    /* hdu 2896 病毒侵袭 ac自动机 从题意得知,模式串中没有重复的串出现,所以结构体中可以将last[](后缀链接)数组去掉 last[]数组主要是记录具有相同后缀模式串的末尾节点编号 .本 ...

  2. hdu 2896 病毒侵袭 AC自动机(查找包含哪些子串)

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

  3. hdu 2896 病毒侵袭 AC自动机 基础题

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

  4. HDU 2896 病毒侵袭 (AC自己主动机)

    pid=2896">http://acm.hdu.edu.cn/showproblem.php?pid=2896 病毒侵袭 Time Limit: 2000/1000 MS (Java ...

  5. hdu 2896 病毒侵袭_ac自动机

    题意:略 思路:套用ac自动机模板 #include <iostream> #include<cstdio> #include<cstring> using nam ...

  6. HDU 2896 病毒侵袭 AC自己主动机题解

    本题是在text里面查找key word的增强版.由于这里有多个text. 那么就不能够简单把Trie的叶子标志记录改动成-1进行加速了,能够使用其它技术.我直接使用个vis数组记录已经訪问过的节点, ...

  7. HDU 2896 病毒侵袭(AC自动机水)

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

  8. HDU 2896 病毒侵袭(AC自动机)

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

  9. HDU 2896 病毒侵袭【AC自动机】

    <题目链接> Problem Description 当太阳的光辉逐渐被月亮遮蔽,世界失去了光明,大地迎来最黑暗的时刻....在这样的时刻,人们却异常兴奋——我们能在有生之年看到500年一 ...

  10. hdu2896 病毒侵袭 ac自动机

    地址:http://acm.split.hdu.edu.cn/showproblem.php?pid=2896 题目: 病毒侵袭 Time Limit: 2000/1000 MS (Java/Othe ...

随机推荐

  1. C++快速排序实现(quicksort)

    quicksort:分治思想. 分解:数组A[p, r)被划分成两个子数组A[pq) 和 A[q+1, r),使得A[pq)中的每个元素小于等于A[q], A[q]也小于A[q+1r)中的每个元素.q ...

  2. 向null地址copy数据和不断改变指针指向

    #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include<string. ...

  3. yum 使用说明

    linux如何安装yum 使用YUM来安装软件,就可以不用去到处找依赖关系的RPM了.很方便. 第一步:安装yum  第二步:下载createrepo包并安装 下载地址: ftp://195.220. ...

  4. BZOJ1668: [Usaco2006 Oct]Cow Pie Treasures 馅饼里的财富

    1668: [Usaco2006 Oct]Cow Pie Treasures 馅饼里的财富 Time Limit: 3 Sec  Memory Limit: 64 MBSubmit: 459  Sol ...

  5. HDOJ 1266 Reverse Number(数字反向输出题)

    Problem Description Welcome to 2006'4 computer college programming contest! Specially, I give my bes ...

  6. .net连接oracle(无客户端)

    使用DDTek.Oracle.dll可以在没有安装oracle客户端的情况下连接远程的oracle. string _conString = "Host=192.168.1.1;Port=1 ...

  7. 使用java创建kafka的生产者和消费者

    创建一个Kafka的主题,连接到zk集群,副本因子3,分区3,主题名是test111        [root@h5 kafka]# bin/kafka-topics.sh --create --zo ...

  8. zoj3422Go Deeper(2-sat + 二分)

    题目请戳这里 题目大意: go(int dep, int n, int m) begin output the value of dep. if dep < m and x[a[dep]] + ...

  9. 2017年开年的第一次比较大的安全事件: MongoDB “赎金事件”,如何看待互联网安全问题

    今天上午(2017年1月7日),我的微信群中同时出现了两个MongoDB被黑掉要赎金的情况,于是在调查过程中,发现了这个事件.这个事件应该是2017年开年的第一次比较大的安全事件吧,发现国内居然没有什 ...

  10. MYSQL存储过程和函数学习笔记

    学至Tarena金牌讲师,金色晨曦科技公司技术总监沙利穆课程笔记的综合. 1. 什么是存储过程和函数 将SQL语句放入一个集合里,然后直接调用存储过程和函数来执行已经定义好的SQL语句,通过存储过程和 ...