链接

ac自动机的模板题

说2个注意的地方 一是题目说明包含所有ASCII字符,可以开到0-127 包含空格

题目会输入多个源串,在加完当前的val值时,不应清0,可以开个标记数组。

  1. #include <iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. #include<stdlib.h>
  6. #include<vector>
  7. #include<cmath>
  8. #include<queue>
  9. #include<set>
  10. using namespace std;
  11. #define N 100010
  12. #define M 510
  13. #define LL long long
  14. #define INF 0xfffffff
  15. const double eps = 1e-;
  16. const double pi = acos(-1.0);
  17. const double inf = ~0u>>;
  18. const int child_num = ;
  19. int g;
  20. int o[M];
  21. char s[N];
  22. bool f[M];
  23. class ACAutomo
  24. {
  25. private:
  26. int ch[N][child_num];
  27. int val[N];
  28. int fail[N];
  29. int Q[N];
  30. int id[];
  31. int sz;
  32. public:
  33. void init()
  34. {
  35. fail[] = ;
  36. for(int i = ; i < child_num ; i++)
  37. id[i] = i;
  38. }
  39. void reset()
  40. {
  41. memset(ch[],,sizeof(ch[]));
  42. sz = ;
  43. }
  44. void insert(char *a,int key)
  45. {
  46. int p = ;
  47. for( ; *a ; a++)
  48. {
  49. int d = id[*a];
  50. if(ch[p][d]==)
  51. {
  52. memset(ch[sz],,sizeof(ch[sz]));
  53. val[p] = ;
  54. ch[p][d] = sz++;
  55. }
  56. p = ch[p][d];
  57. }
  58. val[p]=key;
  59. }
  60. void construct()
  61. {
  62. int i,head=,tail = ;
  63. for(i = ;i < child_num ; i++)
  64. {
  65. if(ch[][i])
  66. {
  67. Q[tail++] = ch[][i];
  68. fail[ch[][i]] = ;
  69. }
  70. }
  71. while(head!=tail)
  72. {
  73. int u = Q[head++];
  74. for(i = ; i < child_num ; i++)
  75. {
  76. if(ch[u][i])
  77. {
  78. Q[tail++] = ch[u][i];
  79. fail[ch[u][i]] = ch[fail[u]][i];
  80. }
  81. else
  82. ch[u][i] = ch[fail[u]][i];
  83. }
  84. }
  85. }
  86. void work(char *s)
  87. {
  88. int i,k = strlen(s);
  89. memset(f,,sizeof(f));
  90. int p = ;
  91. for(i = ;i < k ; i++)
  92. {
  93. int d = id[s[i]];
  94. p = ch[p][d];
  95. int tmp = p;
  96. while(tmp!=&&(val[tmp]!=||f[val[tmp]]))
  97. {
  98. if(!f[val[tmp]])
  99. o[g++] = val[tmp];
  100. f[val[tmp]] = ;
  101. tmp = fail[tmp];
  102. }
  103. }
  104. }
  105. }ac;
  106. int main()
  107. {
  108. int n,m,i;
  109. char vir[];
  110. ac.init();
  111. while(scanf("%d%*c",&n)!=EOF)
  112. {
  113. ac.reset();
  114. for(i = ; i <= n; i++)
  115. {
  116. gets(vir);
  117. ac.insert(vir,i);
  118. }
  119. scanf("%d%*c",&m);
  120. int ans = ;
  121. ac.construct();
  122. for(i = ; i <= m ;i++)
  123. {
  124. gets(s); g = ;
  125. ac.work(s);
  126. if(g==) continue;
  127. printf("web %d:",i);
  128. sort(o,o+g);
  129. for(int j = ;j < g ; j++)
  130. printf(" %d",o[j]);
  131. puts("");
  132. ans++;
  133. }
  134. printf("total: %d\n",ans);
  135. }
  136. return ;
  137. }

hdu2896病毒侵袭(ac自动机)的更多相关文章

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

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

  2. HDU2896 病毒侵袭 —— AC自动机

    题目链接:https://vjudge.net/problem/HDU-2896 病毒侵袭 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit ...

  3. hdu2896 病毒侵袭 ac自动机

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

  4. HDu-2896 病毒侵袭,AC自动机模板题!

    病毒侵袭 模板题,不多说了.. 题意:n个不同的字符串分别代表病毒特征,给出m次查询,每次一个字符串(网址),求这个字符串中有几个病毒特征,分别从大到小输出编号,最后输出所有的带病毒网址个数.格式请看 ...

  5. HDU2896 病毒侵袭 AC自动机模板

    各种MLE,这模板感觉有问题,next数组开128也会MLE,实际上可见字符为编号32~126,只用开100就行. #include <iostream> #include <cst ...

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

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

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

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

  8. 【HDU2896】病毒侵袭 AC自动机

    [HDU2896]病毒侵袭 Problem Description 当太阳的光辉逐渐被月亮遮蔽,世界失去了光明,大地迎来最黑暗的时刻....在这样的时刻,人们却异常兴奋--我们能在有生之年看到500年 ...

  9. hduoj-----(2896)病毒侵袭(ac自动机)

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

随机推荐

  1. java基础学习总结——基础语法1

    一.标识符

  2. IHttpModule

    随便写一个类继承IHttpModule 实现IHttpModule中的两个方法 Init() Dispose() public void Init(HttpApplication context) { ...

  3. zepto源码--核心方法10(位置)--学习笔记

    今天基本上就是zepto学习笔记的最后一篇了,介绍一下有关位置的函数,position, offset, scrollLeft, scrollTop scrollLeft 如果所选取的包装集不存在,则 ...

  4. LightOj 1197 - Help Hanzo(分段筛选法 求区间素数个数)

    题目链接:http://lightoj.com/volume_showproblem.php?problem=1197 题意:给你两个数 a b,求区间 [a, b]内素数的个数, a and b ( ...

  5. js 除法 取整

    js 除法 取整 1.丢弃小数部分,保留整数部分 js:parseInt(7/2) 2.向上取整,有小数就整数部分加1 js: Math.ceil(7/2) 3,四舍五入. js: Math.roun ...

  6. vertical-align属性

    准备阶段 vertical-align取值及含义: 值 含义 baseline 默认.元素放置在父元素的基线上. top 把元素的顶端与行中最高元素的顶端对齐 text-top 把元素的顶端与父元素字 ...

  7. NET基础(1):类型基础

    所有类型都从System.Object 派生,‘运行时’要求每个类型都从System.Object类派生,也就是说,以下两个类型定义完全一致: //隐式派生字Object class Employee ...

  8. sqlserver安装出现问题

    今天用友财务软件免费下载网站小编给 一个客户安装畅捷通T +11.51软件时,首先参照了SQL 2008 R2数据库安装教程安装SQL 2008 R2数据库时碰到一个奇怪的问题现象就是:安 装 SQL ...

  9. HttpClient请求返回JSON、图片

    /** * Created by RongGuang on 2015/9/19. */ public class RongHttp { /** * Http Post请求 * @param url * ...

  10. JQuery EasyUI的datagrid的使用方式总结

    JQuery EasyUI的datagrid的使用方式总结第一步:添加样式和js脚本在前台添加展示数据表格的table元素 例如: <div> <table id="tt& ...