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自动机相关推荐

  1. hdu 2222 ac自动机

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

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

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

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

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

  4. HDU 2222 ac自动机模板

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

  5. hdu 3065 AC自动机

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

  6. HDU 6208 AC自动机

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

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

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

  8. HDU 6096 AC自动机

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

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

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

最新文章

  1. mysql宠物种类表,mysql中的表操作
  2. oracle: 在sqlplus中,执行sql语句
  3. ubuntu内核和主线内核_ubuntu上更新和卸载Linux内核
  4. maxwell中文汉化补丁_《我的世界:地下城》中文剧情流程攻略 通关视频流程
  5. Apache Mahout基于商品的协同过滤算法流程分析
  6. HTTP协议状态码详解(HTTP Status Code)
  7. Codeforces Round #719 (A-C)
  8. Java程序员必知的10个调试技巧
  9. monkey 真机测试步骤
  10. java for in 循环_js的for in循环和java里foreach循环的区别分析
  11. 中国移动咪咕公司:打造五新体验 做5G时代内容的聚合者与生产者
  12. typescript的类型转化
  13. 04轨迹规划基础----正逆运动学的C++代码编写
  14. 短信验证码 超时 java_短信验证码被刷怎么办?java 短信验证码防刷策略
  15. 应届生比老员工更吃香?为什么大厂都在抢应届生
  16. 【NOIP模拟】夕阳
  17. oracle改字体大小_集成开发环境PL/SQL Developer教程:设置行号和修改字体大小
  18. 北风:如何自学营销策划和网络营销?
  19. 贪心算法——国王游戏
  20. sklearn实战之随机森林

热门文章

  1. 推荐美加版S3好用的两个ROM
  2. 查看Linux 系统的配置和增减用户/增减组/增减权限
  3. 人工合成维生素E和天然维生素E的区别
  4. 姜黄的毒副作用调研汇总(调研手稿一)
  5. flink中的faker生成的数据后面带有~
  6. hive中操作struct与map三例
  7. js中输出变量的类型和输出对象的的属性/方法/成员函数
  8. sublime代码整理
  9. ImportError: cannot import name HTTPSHandler
  10. python2.7下面字节数组(ByteArray)和16进制字符串(HexString)转化