AC自动机的裸题。学了kmp和Trie以后不难看懂。

有一些变化,比如0的定义和f的指向,和建立失配边,以及多了后缀连接数组last。没有试过把失配边直接当成普通边(一开始还是先这样写吧)。

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3.  
  4. const int maxlen = 1e6+, maxnds = *+, sigma_size = , maxsubs = ;
  5. char str[maxlen];
  6.  
  7. #define idx(x) x-'a';
  8. int last[maxnds];//后缀连接 为0表示空
  9. int ch[maxnds][sigma_size];
  10. int val[maxnds];
  11. int nds;
  12. char subs[maxsubs][];
  13. int cnt[maxsubs+];
  14. int f[maxnds];
  15.  
  16. void init() {
  17. memset(ch,,sizeof(ch)); last[] = ; val[] = ; nds = ;
  18. memset(cnt,,sizeof(cnt));
  19. }
  20.  
  21. void cal(int j)
  22. {
  23. while(j){
  24. cnt[val[j]]++;
  25. j = last[j];
  26. }
  27. }
  28.  
  29. void Find(char *t)
  30. {
  31. for(int i = , j = ; t[i] ; i++){
  32. int c = idx(t[i]);
  33. while(j && !ch[j][c]) j = f[j];
  34. j = ch[j][c];
  35. if(val[j]) cal(j);
  36. else if(last[j]) cal(last[j]);
  37. }
  38. }
  39.  
  40. int getF()
  41. {
  42. queue<int> q;
  43. f[] = ;
  44. for(int c = ; c < sigma_size; c++){
  45. int u = ch[][c];
  46. if(u) { f[u] = ; q.push(u); last[u] = ; }
  47. }
  48.  
  49. while(q.size()){
  50. int r = q.front(); q.pop();
  51. for(int c = ; c < sigma_size; c++){
  52. int u = ch[r][c];
  53. if(!u) continue;
  54. q.push(u);
  55. int v = f[r];
  56. while(v && !ch[v][c]) v = f[v];
  57. f[u] = ch[v][c];
  58. last[u] = val[f[u]] ? f[u] : last[f[u]];
  59. }
  60. }
  61. }
  62.  
  63. void add(char *s,int str_id)
  64. {
  65. int u = ;
  66. for(int i = ; s[i]; i++){
  67. int c = idx(s[i]);
  68. if(!ch[u][c]){
  69. memset(ch[nds],,sizeof(ch[nds]));
  70. val[nds] = ;
  71. ch[u][c] = nds++;
  72. }
  73. u = ch[u][c];
  74. }
  75. val[u] = str_id;
  76. }
  77.  
  78. int main()
  79. {
  80. //freopen("in.txt","r",stdin);
  81. int n;
  82. while(scanf("%d\n",&n),n){
  83. init();
  84. for(int i = ; i <= n; i++){
  85. scanf("%s",subs[i]);
  86. add(subs[i],i);
  87. }
  88. getF();
  89. scanf("%s",str);
  90. Find(str);
  91. int best = *max_element(cnt+,cnt++n);
  92. printf("%d\n",best);
  93. for(int i = ; i <= n; i++){
  94. if(cnt[i] == best) puts(subs[i]);
  95. }
  96. }
  97. return ;
  98. }

UVALive 4670 Dominating Patterns (AC自动机)的更多相关文章

  1. UVALive 4670 Dominating Patterns --AC自动机第一题

    题意:多个模板串,一个文本串,求出那些模板串在文本串中出现次数最多. 解法:AC自动机入门模板题. 代码: #include <iostream> #include <cstdio& ...

  2. UVALive - 4670 Dominating Patterns AC 自动机

    input n 1<=n<=150 word1 word2 ... wordn 1<=len(wirdi)<=70 s 1<=len(s)<=1000000 out ...

  3. LA 4670 Dominating Patterns (AC自动机)

    题意:给定一个一篇文章,然后下面有一些单词,问这些单词在这文章中出现过几次. 析:这是一个AC自动机的裸板,最后在匹配完之后再统计数目就好. 代码如下: #pragma comment(linker, ...

  4. 【暑假】[实用数据结构]UVAlive 4670 Dominating Patterns

    UVAlive 4670 Dominating Patterns 题目:   Dominating Patterns   Time Limit: 3000MS   Memory Limit: Unkn ...

  5. uvalive 4670 Dominating Patterns

    在文本串中找出现次数最多的子串. 思路:AC自动机模板+修改一下print函数. #include<stdio.h> #include<math.h> #include< ...

  6. UVa1449 - Dominating Patterns(AC自动机)

    题目大意 给定n个由小写字母组成的字符串和一个文本串T,你的任务是找出那些字符串在文本中出现的次数最多 题解 一个文本串,多个模式串,这刚好是AC自动机处理的问题 代码: #include <i ...

  7. UVa 1449 - Dominating Patterns (AC自动机)

    题目大意:给出多个字符串模板,并给出一个文本串,求在文本串中出现最多的模板,输出最多的次数并输出该模板(若有多个满足,则按输入顺序输出). 思路:赤裸裸的 AC自动机,上模板. 代码: #includ ...

  8. LA4670 Dominating Patterns AC自动机模板

    Dominating Patterns 每次看着别人的代码改成自己的模板都很头大...空间少了个0卡了好久 裸题,用比map + string更高效的vector代替蓝书中的处理方法 #include ...

  9. UVa Live 4670 Dominating Patterns - Aho-Corasick自动机

    题目传送门 快速的通道I 快速的通道II 题目大意 给定一堆短串,和一个文本串,问哪些短串在文本串中出现的次数最多. 我觉得刘汝佳的做法,时间复杂度有问题.只是似乎这道题短串串长太短不好卡.比如给出的 ...

随机推荐

  1. select2的远程加载非分页实例

    $("#c01-select").select2({ ajax: { url: "data.json", dataType: 'json', delay: 25 ...

  2. Python 数据分析:让你像写 Sql 语句一样,使用 Pandas 做数据分析

    Python 数据分析:让你像写 Sql 语句一样,使用 Pandas 做数据分析 一.加载数据 import pandas as pd import numpy as np url = ('http ...

  3. 大话Spark(1)-Spark概述与核心概念

    说到Spark就不得不提MapReduce/Hadoop, 当前越来越多的公司已经把大数据计算引擎从MapReduce升级到了Spark. 至于原因当然是MapReduce的一些局限性了, 我们一起先 ...

  4. OVN学习(二)

    部署OVN实验环境 同OVN学习(一) L3网络 创建逻辑交换机和路由 ### Central节点 ### 创建逻辑交换机和路由器 # ovn-nbctl ls-add inside # ovn-nb ...

  5. python-根据URL地址下载文件

    博主个人网站:https://chenzhen.online 使用Python中提供的urllib.request下载网上的文件 #coding=utf-8 """ 目标 ...

  6. How to use unity CreateExternalTexture on Android?

    http://stackoverflow.com/questions/33324753/how-to-use-unity-createexternaltexture-on-android Can so ...

  7. 洛谷P2687 [USACO4.3]逢低吸纳Buy Low, Buy Lower

    P2687 [USACO4.3]逢低吸纳Buy Low, Buy Lower 题目描述 “逢低吸纳”是炒股的一条成功秘诀.如果你想成为一个成功的投资者,就要遵守这条秘诀: "逢低吸纳,越低越 ...

  8. Java基础--基本规则、语法

    一.关键字.保留字.标识符.常量.变量 1.关键字:使用某种语言赋予特殊含义的单词. 2.保留字:没有赋予特殊含义,但以后可能会使用的单词. 3.标识符:自定义的单词,以数字.字母.下划线以及$符组成 ...

  9. maven - 初识

    一.Maven是什么? Maven官网的描述:Apache Maven is a software project management and comprehension tool. Based o ...

  10. Django模板语言,标签整理

    Django模板语言 标签 内置标签引用 1. autoescape 控制自动转义是否可用. 这种标签带有任何 on 或 off 作为参数的话,他将决定转义块内效果. 该标签会以一个endautoes ...