n个字串

m个母串

字串在母串中出现几次

  1. #include<stdio.h>
  2. #include<algorithm>
  3. #include<string.h>
  4. #include<queue>
  5. #include<vector>
  6.  
  7. using namespace std;
  8. #define MAXN 130
  9.  
  10. //AC自动机
  11. class node
  12. {
  13. public:
  14. int index;
  15. node * fail;
  16. node * next[MAXN];
  17. node()
  18. {
  19. index=;
  20. fail=;
  21. memset(next,,sizeof(next));
  22. }
  23. };
  24. node *root;
  25. //插入操作 来看自动机的肯定看过tire 没看过就别看了
  26. void Insert(char *s,int id)
  27. {
  28. node *p=root;
  29. while(*s)
  30. {
  31. int ind=*s-' ';
  32. if(!p->next[ind])
  33. p->next[ind]=new node;
  34. p=p->next[ind];
  35. s++;
  36. }
  37. p->index=id;
  38. }
  39. queue<node*>q1;
  40.  
  41. void Build()
  42. {
  43. q1.push(root);
  44. root->fail=NULL;//根节点
  45. while(!q1.empty())
  46. {
  47. node *p=NULL;
  48. node *now=q1.front();
  49. q1.pop();
  50. for(int i=;i<MAXN;i++)
  51. {
  52. if(now->next[i]) //存在
  53. {
  54. if(now==root) //第二层的话直接就到根
  55. now->next[i]->fail=root;
  56. else
  57. {
  58. p=now->fail;
  59. while(p) //从父亲节点开始找 一直到存在这个孩子节点相同的字母 其实就是后缀相同了
  60. {
  61. if(p->next[i])
  62. {
  63. now->next[i]->fail=p->next[i];
  64. break;
  65. }
  66. p=p->fail;
  67. }
  68. if(p==NULL)
  69. now->next[i]->fail=root;
  70. }
  71. q1.push(now->next[i]);
  72. }
  73. }
  74. }
  75.  
  76. }
  77. bool flag[];
  78. vector<int>z[];
  79. char s1[];
  80. void Ques(char *s1,int id)
  81. {
  82. node *p=root;
  83. memset(flag,,sizeof(flag));
  84. int ind,len=strlen(s1);
  85. for(int i=;i<len;i++)
  86. {
  87. ind=s1[i]-' ';
  88. while(p->next[ind]==NULL&&p!=root)//存在的
  89. p=p->fail;
  90. p=p->next[ind];
  91. if(!p)
  92. p=root;
  93. node *now=p;
  94. while(now!=root&&!flag[now->index])//一个一个检验 这边是否有可以匹配的 子串 后缀相同
  95. {
  96. if(now->index)
  97. {
  98. z[id].push_back(now->index);
  99. flag[now->index]=;
  100. }
  101. now=now->fail;
  102. }
  103. if(z[id].size()>=)
  104. break;
  105. }
  106. }
  107.  
  108. int main()
  109. {
  110. int n;
  111. while(scanf("%d",&n)!=EOF)
  112. {
  113.  
  114. getchar();
  115. char s[];
  116. root=new node;
  117. for(int i=;i<=n;i++)
  118. {
  119. scanf("%s",s);
  120. Insert(s,i);
  121. }
  122. Build();
  123. int m;
  124. scanf("%d",&m);
  125. int ans=;
  126. for(int i=;i<=m;i++)
  127. {
  128. z[i].clear();
  129. scanf("%s",s1);
  130. Ques(s1,i);
  131. if(z[i].size()>)
  132. {
  133. sort(z[i].begin(),z[i].end());
  134. ans++;
  135. }
  136. }
  137. for(int i=;i<=m;i++)
  138. {
  139. if(z[i].size())
  140. {
  141. printf("web %d:",i);
  142. for(int j=;j<z[i].size();j++)
  143. printf(" %d",z[i][j]);
  144. printf("\n");
  145. }
  146. }
  147. printf("total: %d\n",ans);
  148. }
  149. return ;
  150. }

AC自动机 HDU 2896的更多相关文章

  1. 数据结构--AC自动机--hdu 2896

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

  2. AC自动机 HDU 3065

    大概就是裸的AC自动机了 #include<stdio.h> #include<algorithm> #include<string.h> #include< ...

  3. 从0开始 数据结构 AC自动机 hdu 2222

    参考博客 失配指针原理 使当前字符失配时跳转到另一段从root开始每一个字符都与当前已匹配字符段某一个后缀完全相同且长度最大的位置继续匹配,如同KMP算法一样,AC自动机在匹配时如果当前字符串匹配失败 ...

  4. AC自动机 HDU 2222

    t n个字串 1个母串 求出现几个字串 字串可能重复 #include<stdio.h> #include<algorithm> #include<string.h> ...

  5. (17/34)AC自动机/后缀数组/后缀自动机(施工中)

    快补题别再摸鱼了(17/34) 1.AC自动机 #define maxnode 1000010 #define maxsize 26 struct ahocT{ int ch[maxnode][max ...

  6. hdu 2896 AC自动机

    // hdu 2896 AC自动机 // // 题目大意: // // 给你n个短串,然后给你q串长字符串,要求每个长字符串中 // 是否出现短串,出现的短串各是什么 // // 解题思路: // / ...

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

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

  8. AC自动机 - 多模式串的匹配运用 --- HDU 2896

    病毒侵袭 Problem's Link:http://acm.hdu.edu.cn/showproblem.php?pid=2896 Mean: 略 analyse: AC自动机的运用,多模式串匹配. ...

  9. HDU 2896 (AC自动机模板题)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2896 题目大意:多个模式串.多个匹配串.其中串的字符范围是(0~127).问匹配串中含有哪几个模式串 ...

随机推荐

  1. Devexpress Ribbon Add Logo

    一直在网上找类似的效果.在Devpexress控件里面的这个是一个Demo的.没法查看源代码.也不知道怎么写的.所以就在网上搜索了半天的. 终于找到类似的解决办法. 可以使用重绘制的办法的来解决. [ ...

  2. php实现中文转数字,实现方式很智能很php

    分享一个辅助函数,使用php尽可能识别出字符串中的数字,实现效果如下. 1 2 3 4 5 6 7 8 9 echo checkNatInt('九百六十万'); //普通中文数字,9600000 ec ...

  3. spring/spring boot/spring cloud开发总结

    背景        针对RPC远程调用,都在使用dubbo.dubbox等,我们也是如此.由于社区暂停维护.应对未来发展,我们准备尝试新技术(或许这时候也不算什么新技术了吧),选择使用了spring ...

  4. Java01

    1.JAVA历史概述       百度百科:http://baike.baidu.com/view/29.htm      詹姆斯.高斯林  (高司令)----java之父    Sun Micros ...

  5. Hibernnate延迟加载策略(这么详细你还看不懂)

    好久没有认真写过博客了,今天就好好的写一篇吧!!!!!!!!! 当Hibernate 从数据库中加载某个对象(例如:Dept对象)时,如果同时自动加载所有的关联的某个对象(例如:Emp对象),而程序实 ...

  6. js操作table表格导出数据到excel方法

    js导出excel资料很少,网上也找了很多,基本都不能用,要么只能是IE用,还必须要权限,这是非常不好的.后来到github上找到table2excel.js,虽然可以用,但仍然对IE支持不够,也算不 ...

  7. echarts学习总结

    ECharts学习总结使用步骤1 引入ECharts <script src="echarts.min.js"></script>2 绘制一个简单的图表 为 ...

  8. Sharepoint2013 AD组用户不同步

    背景: SP2013列表库使用AD安全组授权访问,向AD安全组添加一个用户A,在Sharepoint AD同步(增量和完全)后,用户A仍然无法访问列表库:原因: 参考:安全令牌上的缓存  SP2013 ...

  9. 萌新笔记——用KMP算法与Trie字典树实现屏蔽敏感词(UTF-8编码)

    前几天写好了字典,又刚好重温了KMP算法,恰逢遇到朋友吐槽最近被和谐的词越来越多了,于是突发奇想,想要自己实现一下敏感词屏蔽. 基本敏感词的屏蔽说起来很简单,只要把字符串中的敏感词替换成"* ...

  10. linux输入子系统(input subsystem)之evdev.c事件处理过程

    1.代码 input_subsys.drv.c 在linux输入子系统(input subsystem)之按键输入和LED控制的基础上有小改动,input_subsys_test.c不变. input ...