Description

对,这就是裸的AC自动机。 
要求:在规定时间内统计出模版字符串在文本中出现的次数。

Input

第一行:模版字符串的个数N。 
第2->N+1行:N个字符串。(每个模版字符串的长度<=50) 
第N+2行:一行很长的字符串。长的很。(使用AC自动机能在1s内计算出)

Output

共N行,每行输出一个模版及出现的次数。(之间有一个空格,按照输入顺序输出)

Sample Input


hers 
her 
his 
she 
shershisher

Sample Output

hers 1 
her 2 
his 1 
she 2

Hint

所有字母均为小写 
所给模版不会重复

模版题 贴代码:
  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<queue>
  5. using namespace std;
  6.  
  7. struct Lin
  8. {
  9. int next[];
  10. int cnt,id;
  11. }a[];
  12. char s[];
  13. int fail[];
  14. int ans[];
  15. char o[][];
  16. int num=;
  17.  
  18. void work(int x)
  19. {
  20. scanf("%s",o[x]);
  21. int ls=strlen(o[x]);int u;
  22. int p=;
  23. for(int i=;i<ls;i++)
  24. {
  25. u=o[x][i]-'a';
  26. if(a[p].next[u])p=a[p].next[u];
  27. else
  28. {
  29. a[p].next[u]=++num;
  30. p=num;
  31. }
  32. }
  33. a[p].cnt++;
  34. a[p].id=x;
  35. }
  36.  
  37. void getfail()
  38. {
  39. queue<int>q;
  40. q.push();
  41. int u,v,p;
  42. while(!q.empty())
  43. {
  44. u=q.front();
  45. q.pop();
  46. for(int i=;i<;i++)
  47. {
  48. v=a[u].next[i];
  49. if(!v)continue;
  50. p=fail[u];
  51. while(p)
  52. {
  53. if(a[p].next[i])
  54. {
  55. break;
  56. }
  57. p=fail[p];
  58. }
  59. if(a[p].next[i] && a[p].next[i]!=v)fail[v]=a[p].next[i];
  60. q.push(v);
  61. }
  62. }
  63. }
  64. void getanswer()
  65. {
  66. scanf("%s",s);
  67. int p=;int ls=strlen(s);int u;int go;
  68. for(int i=;i<ls;i++)
  69. {
  70. u=s[i]-'a';
  71. while(!a[p].next[u] && p)p=fail[p];
  72. p=a[p].next[u];
  73. go=p;
  74. while(go)
  75. {
  76. ans[a[go].id]+=a[go].cnt;
  77. go=fail[go];
  78. }
  79. }
  80. return ;
  81. }
  82.  
  83. int main()
  84. {
  85. int n;
  86. scanf("%d",&n);
  87. for(int i=;i<=n;i++)
  88. work(i);
  89. getfail();
  90. getanswer();
  91. for(int i=;i<=n;i++)
  92. printf("%s %d\n",o[i],ans[i]);
  93. return ;
  94. }
 

【USACO】AC自动机的更多相关文章

  1. BZOJ3075[USACO 2013 Mar Gold 3.Necklace]——AC自动机+DP

    题目描述 给你一个长度为n的字符串A,再给你一个长度为m的字符串B,求至少在A中删去多少个字符才能使得B不是A的子串.注:该题只读入A和B,不读入长度,先读入A,再读入B.数据保证A和B中只含小写字母 ...

  2. [Bzoj3940] [AC自动机,USACO 2015 February Gold] Censor [AC自动机模板题]

    AC自动机模板题(膜jcvb代码) #include <iostream> #include <algorithm> #include <cstdio> #incl ...

  3. AC自动机题单

    AC自动机题目 真的超级感谢xzy 真的帮到我很多 题单 [X] [luogu3808][模板]AC自动机(简单版) https://www.luogu.org/problemnew/show/P38 ...

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

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

  5. AC自动机-算法详解

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

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

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

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

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

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

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

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

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

随机推荐

  1. TensorFlow实现Softmax Regression识别手写数字中"TimeoutError: [WinError 10060] 由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败”问题

    出现问题: 在使用TensorFlow实现MNIST手写数字识别时,出现"TimeoutError: [WinError 10060] 由于连接方在一段时间后没有正确答复或连接的主机没有反应 ...

  2. TCP/IP协议复习

  3. java连接jdbc Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by defa

    conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/jsp_db","root",& ...

  4. day-2 如何搭建一个github代码库

    最近在听尤瓦尔·赫拉利代写的两本书<人类简史>和<未来简史>两本书评,一部描述人类从哪里来,一部描述人类将往哪里去,书中阐述以前我们经历的饥饿.疾病和战争已经渐渐逝去,未来我们 ...

  5. java.lang.String 类源码解读

    String类定义实现了java.io.Serializable, Comparable<String>, CharSequence 三个接口:并且为final修饰. public fin ...

  6. Spark入门(1-2)Spark的特点、生态系统和技术架构

    一.Spark的特点 Spark特性 Spark通过在数据处理过程中成本更低的洗牌(Shuffle)方式,将MapReduce提升到一个更高的层次.利用内存数据存储和接近实时的处理能力,Spark比其 ...

  7. 理解JavaScript中的call和apply方法

    call方法 总的来说call()有这几种作用:1.可以借用另一个对象的方法.2.改变this的指向(重要).3.将arguments数组化.下面详细介绍这三种作用: 1.可以借用另一个对象的方法:当 ...

  8. python jquery

    jquery 一.寻找元素(选择器和筛选器) a.选择器 1.基本选择器 1 $("*")  $("#id")   $(".class")  ...

  9. Windows10下的docker安装与入门 (三) 创建自己的docker镜像并且在容器中运行它

    Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化.容器是完全使用沙箱机制,相互之间不会有任何 ...

  10. Spark测试代码

    测试代码: import org.apache.spark.{SparkConf, SparkContext} import org.apache.spark.sql.hive.HiveContext ...