hdu 3065 AC自动机
// 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自动机相关推荐
- HDU 6208 AC自动机
题意: 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6208 给出n个字符串,要求找到一个字符串包含其他所有的字符串. 思路: 肯定是最长的那个字符串 ...
- hdu 3962(AC自动机+矩阵优化dp)
转载标记处:http://blog.csdn.net/woshi250hua/article/details/7599472 题目大意:给定m个DNA病毒序列,求碱基构成的长度为n且含有两个以上DNA ...
- hdu 2222 ac自动机
对于ac自动机的具体内容,请看如下博客:http://www.cppblog.com/mythit/archive/2009/04/21/80633.html 写的挺好的. 要了解ac自动机就要先知道 ...
- HDU 2222 AC自动机
AC自动机模板题. 什么是Fai指针,指向出现了的最长后缀. 怎么统计,匹配到了模式串,但是,是仅仅一个当前的节点数吗? 不是的,还要继续往Fail指针上走,统计所有的cnt之和. 这个题目设计到,每 ...
- HDU 6096 AC自动机
题解: 主要的思路就是怎么能让这两个串链接起来,还有就是明白AC自动机主要处理什么问题,知道了这些这个问题就能很好的解决了.. #include<bits/stdc++.h> #defi ...
- hdu 2222 AC 自动机 模版(数组实现)
AC 自动机 模版 原文匹配查找时讲错了,其他都挺好(原文博主知错懒得改 t个样例,n个单词,一个文本串,求文本串中单词出现的次数. 若给出单词ab,ab 文本ab,匹配数为2 若给出 n个不重复的单 ...
- HDU 2222(AC自动机模板)
AC自动机这个算法网上有很多资料,这里就不多赘述了. 当从一个字符串中查找另一个字符串,我们有快速的算法KMP. 现在的问题是要从一个字符串中查找很多字符串,或者要从多个字符串里分别查找很多字符串.A ...
- HDU 6208 AC自动机 或 暴力?
简略题意:问是否存在一个串,其他串都是他的子串. 看了题目之后,可以明确一点,极限数据的情况下,暴力一定过不了. 有可能成为目标串的一定是最长串,所有串建AC自动机,用最长串去匹配.如果匹配到了所有串 ...
- HDU 2222 ac自动机模板
题意: 求n个模板串在匹配串中出现了几个. SOL: 反正就是模板啦...似乎比KMP都简单----这么说似乎有点不道德...毕竟先看的KMP而他们并没有什么不同... 貌似自己的理解和他们画的图还是 ...
最新文章
- hibernate教程--一级缓存详解
- JS判断页面控件是否可用
- (原)Eclipse中将JNI生成的so打包成jar的步骤
- Qt--qss(暗橙色)
- 前端学习(2584):ant design pro
- .NET环境下水晶报表使用总
- 海报展示样机模板|给你一个现实的环境
- 小白用GitHub快速搭建自己的网站,可访问,不用买域名、服务器
- oracle unpivot 索引_Oracle 行转列pivot 、列转行unpivot 的Sql语句总结
- LeetCode-124.二叉树中的最大路径和
- python 余弦值,Python向量余弦值 Python 求向量的余弦值操作
- npm WARN deprecated bfj-node4@5.3.1: Switch to the `bfj` package for fixes and new features
- xshell 免费版
- 环信客服SDK接入-----(一)
- 【无标题】ChatGPT的官网是多少,在国内能使用吗
- 21天学会c++(英汉对照,个人翻译,水平有限,供参考)-------第2天
- 【STL】STL空间配置器
- 使用ALLpairs完成正交表测试法练习题
- python随机生成生日测试生日悖论
- 采用先进先出原则对货物的库存进行处理
热门文章
- 从零点五开始用Unity做半个2D战棋小游戏(十)
- 从零点五开始用Unity做半个2D战棋小游戏(二)
- PHP警告:socket_bind():无法绑定地址
- 深入mysql ON DUPLICATE KEY UPDATE 语法的分析
- python 压缩 解压
- nginx 日志获取不到远程访问ip问题解决
- .net开发人员应该知道(一)
- ArcGIS下的多节点可达性分析
- html里table的遍历,js遍历table中的tr
- linux下父子进程共享socket,多进程共享socket(Linux,Win32)