HDU 2222 AC自动机
AC自动机模板题。
什么是Fai指针,指向出现了的最长后缀。
怎么统计,匹配到了模式串,但是,是仅仅一个当前的节点数吗?
不是的,还要继续往Fail指针上走,统计所有的cnt之和。
这个题目设计到,每个模式串只能用一次,在Fail树中,统计过的,要归0;
自动机第一次理解,谢谢卿学姐的视频资料。
#include <cstdio> #include <cstring> #include <algorithm> #include <queue>using namespace std;#define MAX_N 1000005 #define MAX_Tot 500005struct Aho {struct state {int next[26];int fail,cnt;}stateTable[MAX_Tot];int size;std::queue<int> que;void init() {while(que.size()) que.pop();for(int i=0; i < MAX_Tot; i++) {memset(stateTable[i].next,0,sizeof(stateTable[i].next));stateTable[i].fail = stateTable[i].cnt = 0;}size = 1;}void insert(char * S) {int n = strlen(S);int now = 0;for(int i=0; i < n; i++) {char c = S[i];if(!stateTable[now].next[c - 'a'])stateTable[now].next[c - 'a'] = size ++;now = stateTable[now].next[c - 'a'];}stateTable[now].cnt++;}void build() {stateTable[0].fail = -1;que.push(0);while(que.size()) {int u = que.front();que.pop();for(int i=0; i < 26; i++) {if(stateTable[u].next[i]) {if(u==0) stateTable[stateTable[u].next[i]].fail = 0;else {int v = stateTable[u].fail;while(v!=-1) {if(stateTable[v].next[i]) {stateTable[stateTable[u].next[i]].fail = stateTable[v].next[i];break;}v = stateTable[v].fail;}if(v==-1)stateTable[stateTable[u].next[i]].fail = 0;}que.push(stateTable[u].next[i]);}}}}int Get(int u) {int res = 0;while(u) {res = res + stateTable[u].cnt;stateTable[u].cnt = 0;u = stateTable[u].fail;}return res;}int match(char *S) {int n = strlen(S);int res = 0,now = 0;for(int i=0; i < n; i++) {char c = S[i];if(stateTable[now].next[c - 'a'])now = stateTable[now].next[c - 'a'];else {int p = stateTable[now].fail;while(p!=-1&&stateTable[p].next[c - 'a']==0)p = stateTable[p].fail;if(p==-1) now = 0;else now = stateTable[p].next[c - 'a'];}if(stateTable[now].cnt)res = res + Get(now);}return res;}}aho;int T; int N; char S[1000005];int main() {scanf("%d",&T);while(T--) {scanf("%d",&N);aho.init();for(int i=0; i < N; i++) {scanf("%s",S);aho.insert(S);}aho.build();scanf("%s",S);printf("%d\n", aho.match(S));}return 0; }
转载于:https://www.cnblogs.com/TreeDream/p/7388726.html
HDU 2222 AC自动机相关推荐
- hdu 2222 ac自动机
对于ac自动机的具体内容,请看如下博客:http://www.cppblog.com/mythit/archive/2009/04/21/80633.html 写的挺好的. 要了解ac自动机就要先知道 ...
- hdu 2222 AC 自动机 模版(数组实现)
AC 自动机 模版 原文匹配查找时讲错了,其他都挺好(原文博主知错懒得改 t个样例,n个单词,一个文本串,求文本串中单词出现的次数. 若给出单词ab,ab 文本ab,匹配数为2 若给出 n个不重复的单 ...
- HDU 2222(AC自动机模板)
AC自动机这个算法网上有很多资料,这里就不多赘述了. 当从一个字符串中查找另一个字符串,我们有快速的算法KMP. 现在的问题是要从一个字符串中查找很多字符串,或者要从多个字符串里分别查找很多字符串.A ...
- HDU 2222 ac自动机模板
题意: 求n个模板串在匹配串中出现了几个. SOL: 反正就是模板啦...似乎比KMP都简单----这么说似乎有点不道德...毕竟先看的KMP而他们并没有什么不同... 貌似自己的理解和他们画的图还是 ...
- hdu 3065 AC自动机
// hdu 3065 AC自动机 // // 题目大意: // // 给你n个短串,然后给你一个长串,问:各个短串在长串中,出现了多少次 // // 解题思路: // // 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 6096 AC自动机
题解: 主要的思路就是怎么能让这两个串链接起来,还有就是明白AC自动机主要处理什么问题,知道了这些这个问题就能很好的解决了.. #include<bits/stdc++.h> #defi ...
- HDU 6208 AC自动机 或 暴力?
简略题意:问是否存在一个串,其他串都是他的子串. 看了题目之后,可以明确一点,极限数据的情况下,暴力一定过不了. 有可能成为目标串的一定是最长串,所有串建AC自动机,用最长串去匹配.如果匹配到了所有串 ...
最新文章
- mysql宠物种类表,mysql中的表操作
- oracle: 在sqlplus中,执行sql语句
- ubuntu内核和主线内核_ubuntu上更新和卸载Linux内核
- maxwell中文汉化补丁_《我的世界:地下城》中文剧情流程攻略 通关视频流程
- Apache Mahout基于商品的协同过滤算法流程分析
- HTTP协议状态码详解(HTTP Status Code)
- Codeforces Round #719 (A-C)
- Java程序员必知的10个调试技巧
- monkey 真机测试步骤
- java for in 循环_js的for in循环和java里foreach循环的区别分析
- 中国移动咪咕公司:打造五新体验 做5G时代内容的聚合者与生产者
- typescript的类型转化
- 04轨迹规划基础----正逆运动学的C++代码编写
- 短信验证码 超时 java_短信验证码被刷怎么办?java 短信验证码防刷策略
- 应届生比老员工更吃香?为什么大厂都在抢应届生
- 【NOIP模拟】夕阳
- oracle改字体大小_集成开发环境PL/SQL Developer教程:设置行号和修改字体大小
- 北风:如何自学营销策划和网络营销?
- 贪心算法——国王游戏
- sklearn实战之随机森林
热门文章
- 推荐美加版S3好用的两个ROM
- 查看Linux 系统的配置和增减用户/增减组/增减权限
- 人工合成维生素E和天然维生素E的区别
- 姜黄的毒副作用调研汇总(调研手稿一)
- flink中的faker生成的数据后面带有~
- hive中操作struct与map三例
- js中输出变量的类型和输出对象的的属性/方法/成员函数
- sublime代码整理
- ImportError: cannot import name HTTPSHandler
- python2.7下面字节数组(ByteArray)和16进制字符串(HexString)转化