题意:

求每个模式串在母串中出现的次数

  1. #include <map>
  2. #include <set>
  3. #include <list>
  4. #include <cmath>
  5. #include <queue>
  6. #include <stack>
  7. #include <cstdio>
  8. #include <vector>
  9. #include <string>
  10. #include <cctype>
  11. #include <complex>
  12. #include <cassert>
  13. #include <utility>
  14. #include <cstring>
  15. #include <cstdlib>
  16. #include <iostream>
  17. #include <algorithm>
  18. using namespace std;
  19. typedef pair<int,int> PII;
  20. typedef long long ll;
  21. #define lson l,m,rt<<1
  22. #define pi acos(-1.0)
  23. #define rson m+1,r,rt<<11
  24. #define All 1,N,1
  25. #define read freopen("in.txt", "r", stdin)
  26. #define N 250001
  27. const ll INFll = 0x3f3f3f3f3f3f3f3fLL;
  28. const int INF= 0x7ffffff;
  29. const int mod = ;
  30. char p[][],q[];
  31. int n,used[N],mer[N];
  32. struct Trie{
  33. int ch[N][],val[N],f[N],num;
  34. void init(){
  35. num=;
  36. memset(ch,,sizeof(ch));
  37. memset(val,,sizeof(val));
  38. memset(f,,sizeof(f));
  39. }
  40. int build(char *s){
  41. int u=,len=strlen(s);
  42. for(int i=;i<len;++i)
  43. {
  44. int v=s[i]-'a';
  45. if(!ch[u][v]){
  46. memset(ch[num],,sizeof(ch[num]));
  47. ch[u][v]=num++;
  48. }
  49. u=ch[u][v];
  50. }
  51. val[u]++;
  52. return u;
  53. }
  54. void getfail(){
  55. queue<int>q;
  56. for(int i=;i<;++i)
  57. if(ch[][i])
  58. q.push(ch[][i]);
  59. while(!q.empty()){
  60. int r=q.front();
  61. q.pop();
  62. for(int i=;i<;++i)
  63. {
  64. int u=ch[r][i];
  65. if(!u){ch[r][i] = ch[f[r]][i];continue;}
  66. q.push(u);
  67. int v=f[r];
  68. while(v&&!ch[v][i])v=f[v];
  69. f[u]=ch[v][i];
  70. }
  71. }
  72. }
  73. void find(char *T){
  74. set<int>se;
  75. int u=,len=strlen(T);
  76. for(int i=;i<len;++i){
  77. int v=T[i]-'a';
  78. while(u&&ch[u][v]==)
  79. u=f[u];
  80. u=ch[u][v];
  81. int tmp=u;
  82. while(tmp){
  83. if(se.find(tmp)==se.end()){
  84. se.insert(tmp);
  85. mer[tmp]++;
  86. }
  87. tmp=f[tmp];
  88. }
  89. }
  90. }
  91. }ac;
  92. int main()
  93. {
  94. int n,m,hao[];
  95. ac.init();
  96. scanf("%d",&m);
  97. for(int i=;i<=m;++i)
  98. {
  99. scanf("%s",p[i]);
  100. }
  101. scanf("%d",&n);
  102. for(int i=;i<=n;++i){
  103. scanf("%s",q);
  104. hao[i]=ac.build(q);
  105. }
  106. ac.getfail();
  107. memset(mer,,sizeof(mer));
  108. for(int i=;i<=m;++i){
  109. ac.find(p[i]);
  110. }
  111. for(int i=;i<=n;++i)
  112. printf("%d\n",mer[hao[i]]);
  113. return ;
  114. }

LightOJ 1427 -Repository(ac自动机)的更多相关文章

  1. Substring Frequency (II) LightOJ - 1427 AC自动机

    https://vjudge.net/problem/LightOJ-1427 把所有模式串加入ac自动机,然后search的时候暴力,每个子串都暴力一下就好. 其实AC自动机就是,先建立好trie图 ...

  2. 基于trie树做一个ac自动机

    基于trie树做一个ac自动机 #!/usr/bin/python # -*- coding: utf-8 -*- class Node: def __init__(self): self.value ...

  3. AC自动机-算法详解

    What's Aho-Corasick automaton? 一种多模式串匹配算法,该算法在1975年产生于贝尔实验室,是著名的多模式匹配算法之一. 简单的说,KMP用来在一篇文章中匹配一个模式串:但 ...

  4. python爬虫学习(11) —— 也写个AC自动机

    0. 写在前面 本文记录了一个AC自动机的诞生! 之前看过有人用C++写过AC自动机,也有用C#写的,还有一个用nodejs写的.. C# 逆袭--自制日刷千题的AC自动机攻克HDU OJ HDU 自 ...

  5. BZOJ 2434: [Noi2011]阿狸的打字机 [AC自动机 Fail树 树状数组 DFS序]

    2434: [Noi2011]阿狸的打字机 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 2545  Solved: 1419[Submit][Sta ...

  6. BZOJ 3172: [Tjoi2013]单词 [AC自动机 Fail树]

    3172: [Tjoi2013]单词 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 3198  Solved: 1532[Submit][Status ...

  7. BZOJ 1212: [HNOI2004]L语言 [AC自动机 DP]

    1212: [HNOI2004]L语言 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1367  Solved: 598[Submit][Status ...

  8. [AC自动机]【学习笔记】

    Keywords Search Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)To ...

  9. AC自动机 HDU 3065

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

随机推荐

  1. HttpServletRequestWrapper的使用

    老大给了一个很实际的需求:有段程序,使用Http的方式与合作商交互,而且是明文传输数据.我方的代码已经打包放在服务器上运行了很长时间,这时合作商突然要求修改数据传输的方式,要求加密后再传输,而我方的原 ...

  2. 使用CAShapeLayer与UIBezierPath画出想要的图形

    使用CAShapeLayer与UIBezierPath可以实现不在view的drawRect方法中就画出一些想要的图形 步骤: 1.新建UIBezierPath对象bezierPath 2.新建CAS ...

  3. IOS 逆向工程之砸壳

    在<iOS应用逆向工程>4.6.2节中,我们曾推荐使用iPhoneCake源的AppCrackr 1.7版给App砸壳.这种方式简单粗暴,省时省力,但正是因为它过于方便有木有,导致几乎所有 ...

  4. Eclipse项目和MyEclipse项目

    因为Eclipse的项目结构和MyEclipse项目的结构不同,所以两者的项目之间不能直接运行的. 我们在创建Eclipse项目的时候可以进行一些设置,这样在Eclipse中创建的项目可以直接在MyE ...

  5. C++:虚函数的详解

    5.4.2 虚函数详解 1.虚函数的定义 虚函数就是在基类中被关键字virtual说明,并在派生类重新定义的函数.虚函数的作用是允许在派生类中重新定义与基类同名的函数,并且可以通过基类指针或引用来访问 ...

  6. C Socket Programming for Linux with a Server and Client Example Code

    Typically two processes communicate with each other on a single system through one of the following ...

  7. 自定义View(5)Paint常用的一些绘制滤镜,特效等介绍

    Shader 返回绘图过程中重复色块的基类 相关方法:Paint::setShader(Shader shader) BitmapShader 从位图加载重复色块 LinearGradient, Ra ...

  8. php整理(二): 数组

    数组: 首先说一下对PHP中的理解,建立一个好的理解模型还是很关键的: 1.PHP中的数组实际上可以理解为键值对,key=>value;而对于key的取值,可以是string/integer;v ...

  9. 抽象工厂在ADO.Net中的应用

    https://msdn.microsoft.com/zh-cn/library/ms971499.aspx http://www.c-sharpcorner.com/UploadFile/moses ...

  10. [HDOJ2818]Building Block(带权并查集,路径压缩)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2818 题意:有N个块,每次有两个操作: M x y表示把x所在的那一堆全部移到y所在的那一堆的下方. ...