//    hdu 3065 AC自动机
//
//    题目大意:
//
//        给你n个短串,然后给你一个长串,问:各个短串在长串中,出现了多少次
//
//    解题思路:
//
//        AC自动机,插入,构建,查询就OK啦
//
//    感悟:
//
//        这道题真的是1A的哟~~~很开心~~~尽管是个裸地,继续加油哟~~~FIGHTING

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <queue>
using namespace std;const int MAX_NODE = 200000;
const int SIGMA = 131;struct Aho_Corasick{int ch[MAX_NODE][SIGMA];int f[MAX_NODE];int val[MAX_NODE];int last[MAX_NODE];int cnt[1008];int sz;void init(){sz = 1;memset(ch[0],0,sizeof(ch[0]));memset(cnt,0,sizeof(cnt));val[0] = 0;}void insert(char *s, int v){int u = 0;int n = strlen(s);for (int i=0;i<n;i++){int c = s[i];if (!ch[u][c]){memset(ch[sz],0,sizeof(ch[sz]));val[sz] = 0;ch[u][c] = sz++;}u = ch[u][c];}val[u] = v;}void getfail(){queue<int> que;for (int c = 0;c < SIGMA; c++){int u = ch[0][c];if(u){que.push(u);f[u] = 0;last[u] = 0;}}while(!que.empty()){int r = que.front();que.pop();for (int c = 0 ; c < SIGMA;c++){int u = ch[r][c];if (!u)continue;que.push(u);int v = f[r];while( v && !ch[v][c])v = f[v];f[u] = ch[v][c];last[u] = val[f[u]] ? f[u] : last[f[u]];}}}void get_cnt(int u){if (u){cnt[val[u]]++;get_cnt(last[u]);}}void query(char *s){int u = 0;int n = strlen(s);for(int i=0;i<n;i++){int c = s[i];while(u && !ch[u][c])u = f[u];u = ch[u][c];if (val[u]){get_cnt(u);}else if (last[u]){get_cnt(last[u]);}}}}ac;int n;char p[1008][52];char str[2000008];void input(){ac.init();char s[52];for (int i=1;i<=n;i++){scanf("%s",s);memcpy(p[i],s,sizeof(s));ac.insert(s,i);}ac.getfail();scanf("%s",str);ac.query(str);for (int i = 1;i<=n;i++){if (ac.cnt[i]){printf("%s: %d\n",p[i],ac.cnt[i]);}}
}int main(){//freopen("1.txt","r",stdin);while(scanf("%d",&n)!=EOF){input();}return 0;
}

转载于:https://www.cnblogs.com/KingJourney/p/4703400.html

hdu 3065 AC自动机相关推荐

  1. HDU 6208 AC自动机

    题意: 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6208 给出n个字符串,要求找到一个字符串包含其他所有的字符串. 思路: 肯定是最长的那个字符串 ...

  2. hdu 3962(AC自动机+矩阵优化dp)

    转载标记处:http://blog.csdn.net/woshi250hua/article/details/7599472 题目大意:给定m个DNA病毒序列,求碱基构成的长度为n且含有两个以上DNA ...

  3. hdu 2222 ac自动机

    对于ac自动机的具体内容,请看如下博客:http://www.cppblog.com/mythit/archive/2009/04/21/80633.html 写的挺好的. 要了解ac自动机就要先知道 ...

  4. HDU 2222 AC自动机

    AC自动机模板题. 什么是Fai指针,指向出现了的最长后缀. 怎么统计,匹配到了模式串,但是,是仅仅一个当前的节点数吗? 不是的,还要继续往Fail指针上走,统计所有的cnt之和. 这个题目设计到,每 ...

  5. HDU 6096 AC自动机

    题解:  主要的思路就是怎么能让这两个串链接起来,还有就是明白AC自动机主要处理什么问题,知道了这些这个问题就能很好的解决了.. #include<bits/stdc++.h> #defi ...

  6. hdu 2222 AC 自动机 模版(数组实现)

    AC 自动机 模版 原文匹配查找时讲错了,其他都挺好(原文博主知错懒得改 t个样例,n个单词,一个文本串,求文本串中单词出现的次数. 若给出单词ab,ab 文本ab,匹配数为2 若给出 n个不重复的单 ...

  7. HDU 2222(AC自动机模板)

    AC自动机这个算法网上有很多资料,这里就不多赘述了. 当从一个字符串中查找另一个字符串,我们有快速的算法KMP. 现在的问题是要从一个字符串中查找很多字符串,或者要从多个字符串里分别查找很多字符串.A ...

  8. HDU 6208 AC自动机 或 暴力?

    简略题意:问是否存在一个串,其他串都是他的子串. 看了题目之后,可以明确一点,极限数据的情况下,暴力一定过不了. 有可能成为目标串的一定是最长串,所有串建AC自动机,用最长串去匹配.如果匹配到了所有串 ...

  9. HDU 2222 ac自动机模板

    题意: 求n个模板串在匹配串中出现了几个. SOL: 反正就是模板啦...似乎比KMP都简单----这么说似乎有点不道德...毕竟先看的KMP而他们并没有什么不同... 貌似自己的理解和他们画的图还是 ...

最新文章

  1. hibernate教程--一级缓存详解
  2. JS判断页面控件是否可用
  3. (原)Eclipse中将JNI生成的so打包成jar的步骤
  4. Qt--qss(暗橙色)
  5. 前端学习(2584):ant design pro
  6. .NET环境下水晶报表使用总
  7. 海报展示样机模板|给你一个现实的环境
  8. 小白用GitHub快速搭建自己的网站,可访问,不用买域名、服务器
  9. oracle unpivot 索引_Oracle 行转列pivot 、列转行unpivot 的Sql语句总结
  10. LeetCode-124.二叉树中的最大路径和
  11. python 余弦值,Python向量余弦值 Python 求向量的余弦值操作
  12. npm WARN deprecated bfj-node4@5.3.1: Switch to the `bfj` package for fixes and new features
  13. xshell 免费版
  14. 环信客服SDK接入-----(一)
  15. 【无标题】ChatGPT的官网是多少,在国内能使用吗
  16. 21天学会c++(英汉对照,个人翻译,水平有限,供参考)-------第2天
  17. 【STL】STL空间配置器
  18. 使用ALLpairs完成正交表测试法练习题
  19. python随机生成生日测试生日悖论
  20. 采用先进先出原则对货物的库存进行处理

热门文章

  1. 从零点五开始用Unity做半个2D战棋小游戏(十)
  2. 从零点五开始用Unity做半个2D战棋小游戏(二)
  3. PHP警告:socket_bind():无法绑定地址
  4. 深入mysql ON DUPLICATE KEY UPDATE 语法的分析
  5. python 压缩 解压
  6. nginx 日志获取不到远程访问ip问题解决
  7. .net开发人员应该知道(一)
  8. ArcGIS下的多节点可达性分析
  9. html里table的遍历,js遍历table中的tr
  10. linux下父子进程共享socket,多进程共享socket(Linux,Win32)