1. /**
  2. 题目:hdu2896 病毒侵袭
  3. 链接:http://acm.hdu.edu.cn/showproblem.php?pid=2896
  4. 题意:N(N <= 500)个长度不大于200的模式串(保证所有的模式串都不相同),
  5. M(M <= 1000)个长度不大于10000的待匹配串,问待匹配串中有哪几个模式串,
  6. 题目保证每个待匹配串中最多有三个模式串。
  7. 思路:ac自动机做法,字符为可见字符,那么直接就是他们的ascii值作为每一个字符的标志。最多128;
  8. 由于不超过三个,所以找到3个就可以return ;节约时间。
  9.  
  10. AC自动机好文章:http://www.cppblog.com/menjitianya/archive/2014/07/10/207604.html
  11. */
  12.  
  13. #include<bits/stdc++.h>
  14. using namespace std;
  15. #define P pair<int,int>
  16. #define ms(x,y) memset(x,y,sizeof x)
  17. #define LL long long
  18. const int maxn = ;
  19. const int mod = 1e9+;
  20. const int maxnode = *+;
  21. const int sigma_size = ;
  22. vector<int> ans;
  23. struct AhoCorasickAutomata
  24. {
  25. int ch[maxnode][sigma_size];
  26. int val[maxnode];
  27. int sz;
  28. int f[maxnode];
  29. int last[maxnode];
  30. void clear(){sz = ; memset(ch[],,sizeof ch[]); }
  31. int idx(char c){return c-'a'; }
  32.  
  33. void insert(char *s,int x)
  34. {
  35. int u = , n = strlen(s);
  36. for(int i = ; i < n; i++){
  37. //int c = idx(s[i]);
  38. int c = s[i];
  39. if(!ch[u][c]){
  40. memset(ch[sz], , sizeof ch[sz]);
  41. val[sz] = ;
  42. ch[u][c] = sz++;
  43. }
  44. u = ch[u][c];
  45. }
  46. val[u] = x;
  47. }
  48.  
  49. void find(char *T){
  50. int n = strlen(T);
  51. int j = ;
  52. for(int i = ; i < n; i++){
  53. int c = T[i];
  54. //while(j&&!ch[j][c]) j = f[j];
  55. j = ch[j][c];
  56. if(val[j]) print(j);
  57. else if(last[j]) print(last[j]);
  58. if(ans.size()==) return ;
  59. }
  60. }
  61.  
  62. void print(int j)
  63. {
  64. if(j){
  65. ans.push_back(val[j]);
  66. if(ans.size()==) return ;
  67. print(last[j]);
  68. }
  69. }
  70.  
  71. void getFail(){
  72. queue<int> q;
  73. f[] = ;
  74. for(int c = ; c < sigma_size; c++){
  75. int u = ch[][c];
  76. if(u){f[u] = ; q.push(u); last[u] = ;}
  77. }
  78.  
  79. while(!q.empty()){
  80. int r = q.front(); q.pop();
  81. for(int c = ; c < sigma_size; c++){
  82. int u = ch[r][c];
  83. if(!u){
  84. ch[r][c] = ch[f[r]][c]; continue;
  85. }//if(!u) continue;
  86. q.push(u);
  87. int v = f[r];
  88. while(v&&!ch[v][c]) v = f[v];
  89. f[u] = ch[v][c];
  90. last[u] = val[f[u]] ? f[u] : last[f[u]];
  91. }
  92. }
  93. }
  94.  
  95. } ac ;
  96. char s[];
  97. int main()
  98. {
  99. int n, m;
  100. while(scanf("%d",&n)==)
  101. {
  102. ac.clear();
  103. for(int i = ; i <= n; i++){
  104. scanf("%s",s);
  105. ac.insert(s,i);
  106. }
  107. ac.getFail();
  108. scanf("%d",&m);
  109. int cnt = ;
  110. for(int i= ; i <= m; i++){
  111. ans.clear();
  112. scanf("%s",s);
  113. ac.find(s);
  114. if(ans.size()!=){
  115. cnt++;
  116. printf("web %d:",i);
  117. sort(ans.begin(),ans.end());
  118. for(int j = ; j < (int)ans.size(); j++){
  119. printf(" %d",ans[j]);
  120. }
  121. printf("\n");
  122. }
  123. }
  124. printf("total: %d\n",cnt);
  125. }
  126. return ;
  127. }
  128.  
  129. /*
  130. 3
  131. aaa
  132. bbb
  133. ccc
  134. 2
  135. aaabbbccc
  136. bbaacc
  137. */

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

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

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

  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. hdu2896病毒侵袭(ac自动机)

    链接 ac自动机的模板题 说2个注意的地方 一是题目说明包含所有ASCII字符,可以开到0-127 包含空格 题目会输入多个源串,在加完当前的val值时,不应清0,可以开个标记数组. #include ...

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. NYOJ-------笨蛋难题四

    笨蛋难题四 时间限制:1000 ms  |           内存限制:65535 KB 难度:3   描述 这些日子笨蛋一直研究股票,经过调研,终于发现xxx公司股票规律,更可喜的是 笨蛋推算出这 ...

  2. struts2 xml配置文件配置传参数

    传参方式 重定向 第一方式: <action name="search" method="search"            class="c ...

  3. OpenXml读取word内容注意事项

    OpenXml读取word内容注意事项 1.使用OpenXml读取word内容,word后缀必须是".docx":如果word后缀是".doc"需要转成&quo ...

  4. 摘:VC开发数据库基础之ADO篇

    一.ADO简介ADO(ActiveX Data Object)是Microsoft数据库应用程序开发的新接口,是建立在OLE DB之上的高层数据库访问技术,请不必为此担心,即使你对OLE DB,COM ...

  5. 图解最小生成树 - 克鲁斯卡尔(Kruskal)算法

    我们在前面讲过的<克里姆算法>是以某个顶点为起点,逐步找各顶点上最小权值的边来构建最小生成树的.同样的思路,我们也可以直接就以边为目标去构建,因为权值为边上,直接找最小权值的边来构建生成树 ...

  6. Unix环境高级编程(八)进程关系

    本章看后给人似懂非懂的感觉,主要是不知道实际当中如何去使用.通过前面几章的学习,每个进程都有一个父进程,当子进程终止时,父进程得到通知并取得子进程的退出状态.先将本章基本的知识点总结如下,日后再看时候 ...

  7. Cocos2d-x游戏移植到WP8之路 -- c++和c#交互

    Cocos2d-x是眼下最流行的手机游戏引擎之中的一个,开源.轻量.多平台等的诸多特性使得它被非常多国内外手游开发人员所喜爱. 利用Cocos2d-x来开发Windows Phone 8的游戏相同也是 ...

  8. 温故而知新 gulp.src 指定数组文件夹

    gulp.src语法是基于这个库来实现的,所以详情请看这个API: https://www.gulpjs.com.cn/docs/api/ https://github.com/isaacs/node ...

  9. Latex中定义、定理、引理、证明 设置方法总结

    Latex中定义.定理.引理.证明 设置方法总结 在LaTex中需要有关定理.公理.命题.引理.定义等时,常用如下命令 \newtheorem{定理环境名}{标题}[主计数器名] \newtheore ...

  10. Spring里的aop实现方式和源码分析

    使用"横切"技术,AOP把软件系统分为两个部分:核心关注点和横切关注点.业务处理的主要流程是核心关注点,与之关系不大的部分是横切关注点.横切关注点的一个特点是,他们经常发生在核心关 ...