链接:http://acm.hdu.edu.cn/showproblem.php?pid=5384

题意:给n个母串,给m个匹配串,求每个母串依次和匹配串匹配,能得到的数目和。

分析:之前并不知道AC自动机是用来求什么的,但翻模板的时候看见邝斌的字符串模板里有AC自动机一项,就看了一下,然后发现和题目要解决的问题一模一样。就开始改模板。结果没想到就是个裸的AC自动机,以为会TLE,10^10呢,迟迟不敢交,又被坑了。

目前对原理还一无所知。

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <queue>
  4. using namespace std;
  5. inline int Max(int a,int b)
  6. {
  7. return a>b?a:b;
  8. }
  9. inline int Min(int a,int b)
  10. {
  11. return a>b?b:a;
  12. }
  13. #define maxnode 600010
  14. #define sigma_size 26
  15. struct Trie
  16. {
  17. int ch[maxnode][sigma_size];
  18. int val[maxnode];
  19. int haha[maxnode];
  20. int f[maxnode];
  21. int sz;
  22. void init()
  23. {
  24. sz=;
  25. memset(ch,,sizeof(ch));
  26. memset(val, , sizeof(val));
  27. memset(f,,sizeof(f));
  28. memset(haha,,sizeof(haha));
  29. }
  30. int idx(char c)
  31. {
  32. return c-'a';
  33. }
  34. int insert(char *s)
  35. {
  36. int u = , len = strlen(s);
  37. for(int i = ; i < len; i++)
  38. {
  39. int c = idx(s[i]);
  40. if(!ch[u][c]) ch[u][c] = sz++;
  41. u = ch[u][c];
  42. }
  43. val[u] ++;
  44. return u;
  45. }
  46. void getFail()
  47. {
  48. queue<int> q;
  49. for(int i = ; i<sigma_size; i++)
  50. if(ch[][i]) q.push(ch[][i]);
  51.  
  52. while(!q.empty())
  53. {
  54. int r = q.front();
  55. q.pop();
  56. for(int c = ; c<sigma_size; c++)
  57. {
  58. int u = ch[r][c];
  59. if(!u)continue;
  60. q.push(u);
  61. int v = f[r];
  62. while(v && ch[v][c] == ) v = f[v]; ///沿失配边走上去 如果失配后有节点 且 其子节点c存在则结束循环
  63. f[u] = ch[v][c];
  64. }
  65. }
  66. }
  67. void find(char *T)
  68. {
  69. int len = strlen(T), j = ;
  70. for(int i = ; i < len; i++)
  71. {
  72. int c = idx(T[i]);
  73. while(j && ch[j][c]==) j = f[j];
  74. j = ch[j][c];
  75. int temp = j;
  76. while(temp)
  77. {
  78. haha[temp]++;
  79. temp = f[temp];
  80. }
  81. }
  82. }
  83. };
  84. Trie ac;
  85. char P[][];
  86. int ans[];
  87. char S1[];
  88. int main()
  89. {
  90. int t,m,n;
  91. scanf("%d",&t);
  92. while(t--)
  93. {
  94. ac.init();
  95. scanf("%d%d",&m,&n);
  96. for(int i = ; i <= m; i++)
  97. {
  98. scanf("%s",P[i]);
  99. }
  100. for(int i = ; i <= n; i++)
  101. {
  102. scanf("%s",S1);
  103. ans[i] = ac.insert(S1);
  104. }
  105. ac.getFail();
  106. for(int i = ; i <= m; i++)
  107. {
  108. memset(ac.haha,,sizeof(ac.haha));
  109. ac.find(P[i]);
  110. int sum = ;
  111. for(int i=; i <= n; i++)
  112. sum += ac.haha[ans[i]];
  113. printf("%d\n",sum);
  114. }
  115. }
  116. return ;
  117. }

AC自动机--改自久野模板

模板:http://blog.csdn.net/qq574857122/article/details/12355091

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

  1. hdu 2896 AC自动机

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

  2. hdu 3065 AC自动机

    // hdu 3065 AC自动机 // // 题目大意: // // 给你n个短串,然后给你一个长串,问:各个短串在长串中,出现了多少次 // // 解题思路: // // AC自动机,插入,构建, ...

  3. hdu 5880 AC自动机

    Family View Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total ...

  4. hdu 2296 aC自动机+dp(得到价值最大的字符串)

    Ring Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  5. hdu 2825 aC自动机+状压dp

    Wireless Password Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others ...

  6. hdu 3065 AC自动机(各子串出现的次数)

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

  7. HDU 2222 AC自动机模板题

    题目: http://acm.hdu.edu.cn/showproblem.php?pid=2222 AC自动机模板题 我现在对AC自动机的理解还一般,就贴一下我参考学习的两篇博客的链接: http: ...

  8. HDU 2846 (AC自动机+多文本匹配)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2846 题目大意:有多个文本,多个模式串.问每个模式串中,有多少个文本?(匹配可重复) 解题思路: 传统 ...

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

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

随机推荐

  1. 夕甲甲——孔乙己之C++版

    欧欧匹代码的格局,是和别的编程模式不同的:首先要有一个构造函数:基类里只定义了函数的形式,可以随时通过派生增加不同的实现.那些程序员们,每每学会了继承和多态,便可以接一个项目,——这是十年前的事,现在 ...

  2. iPhone / iPad UI界面设计与图标设计的尺寸设计规范+安卓+网页

    ①iPhone的设计尺寸 iPhone界面尺寸: 设备 分辨率 状态栏高度 导航栏高度 标签栏(工具栏)高度 iPhone6 plus设计版 1242 × 2208 60px 132px 146px ...

  3. web.config连接字符串的一些总结

    阅读目录: DS01:数据库连接字符串的两种写法 DS02:数据库连接字符串的内容 DS01:数据库连接字符串的两种写法 1.连接字符串的两种写法: <configuration>   & ...

  4. CSS入门

    CSS,层叠样式表,是对web页面显示效果进行控制的一套标准.当页面的内容受多种样式控制,将会按照一定的顺序处理.CSS的作用:(1)将网页的内容结构和格式控制分开.(2)可以精确控制页面的所有元素. ...

  5. 查询Sqlserver数据库死锁的一个存储过程

    From:http://www.cnblogs.com/mzhanker/archive/2011/06/04/2072739.html 使用sqlserver作为数据库的应用系统,都避免不了有时候会 ...

  6. 《Android深度探索》(卷1)HAL与驱动开发读后感:

    第一章:安卓系统移植与驱动开发概述 全书分为4篇,分别从搭建开发环境,Linux驱动和Android HAL的基础知识,开发Linux驱动的高级技术和分析典型的Linux驱动源代码4个方面介绍Andr ...

  7. 关于C#的内存释放问题

    最近在做一个要循环读取xml文件的功能. 想法是读取一个文件,释放一个文件,这样就不会消耗太多内存. 结果运行起来内存不停涨,最后内存溢出.用gc,disponse,异步都没有用. 后来改成relea ...

  8. Builder模式

    原文来源于http://www.iteye.com/topic/71175 对于Builder模式很简单,但是一直想不明白为什么要这么设计,为什么要向builder要Product而不是向知道建造过程 ...

  9. Unity3D之GUITexture的坐标体系

    Unity3D的GUITexture的坐标,其中x和y的取值在0~1之间,层次使用z来划分,值越大越靠前.

  10. css3中transition和animation的回调处理

    弱鸡最近在准备面试,网上找了一些题,发现一些基础题也完全答不好(┬_┬)看来还是要再接再励啊w(゚Д゚)w 言归正传,今天的主题是CSS3中的动画回调处理,这里动画执行完毕后触发的事件是transit ...