AC 自动机 模版 原文匹配查找时讲错了,其他都挺好(原文博主知错懒得改

t个样例,n个单词,一个文本串,求文本串中单词出现的次数。 若给出单词ab,ab 文本ab,匹配数为2

若给出 n个不重复的单词和一个文本,问单词的出现次数,则cntword[j]不置-1,且循环条件变为 j !=0。

如单词AA , BB CC. 串ooxxCC%dAAAoen....END,则串 AA出现2次, CC出现 1次


#include <queue>
#include <cstdlib>
#include <cmath>
#include <cstdio>
#include <string>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
const int maxn =  1e6+9;int trie[maxn][26]; //字典树
int cntword[maxn];  //记录该单词出现次数
int fail[maxn];     //失败时的回溯指针
int cnt = 0;//结点个数void insertWords(char s[],int len) {int root = 0;for(int i=0; i<len; i++) {int next = s[i] - 'a';if(!trie[root][next])trie[root][next] = ++cnt;root = trie[root][next];}cntword[root]++;      //当前结点单词数+1
}
void getFail() {queue <int>q;for(int i=0; i<26; i++) {   //将第二层所有出现了的字母扔进队列if(trie[0][i]) {fail[trie[0][i]] = 0;q.push(trie[0][i]);}}//fail[now]    ->当前节点now的失败指针指向的地方
tire[now][i] -> 下一个字母为i+'a'的节点的下标为tire[now][i]while(!q.empty()) {int now = q.front();q.pop();for(int i=0; i<26; i++) {   //查询26个字母if(trie[now][i]) {//如果有这个子节点为字母i+'a',则
//让这个节点的失败指针指向(((他父亲节点)的失败指针所指向的那个节点)的下一个节点)//有点绕,为了方便理解特意加了括号fail[trie[now][i]] = trie[fail[now]][i];q.push(trie[now][i]);} else //否则就让当前节点的这个子节点//指向当前节点fail指针的这个子节点trie[now][i] = trie[fail[now]][i];}}
}int query(char s[],int len) {int now = 0,ans = 0;for(int i=0; i<len; i++) { //遍历文本串now = trie[now][s[i]-'a'];  //从s[i]点开始寻找for(int j=now; j && cntword[j]!=-1; j=fail[j]) {//一直向下寻找,直到匹配失败(失败指针指向根或者当前节点已找过).ans += cntword[j];cntword[j] = -1;    //将遍历过后的节点标记,防止重复计算}}return ans;
}int main() {int n,t;char s[1000005];scanf("%d",&t);while(t--) {memset(cntword,0,sizeof(cntword));memset(fail,0,sizeof(fail));memset(trie,0,sizeof(trie));cnt = 0;scanf("%d",&n);for(int i=0; i<n; i++) {scanf("%s",s) ;//输入单词insertWords(s,strlen(s));}fail[0] = 0;getFail();scanf("%s",s);//查找文本串cout << query(s,strlen(s)) << endl;}return 0;
}
/*
4
ash shex bcd sha
ashex*/

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

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

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

  4. HDU 2222 ac自动机模板

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

  5. HDU2896(AC自动机模版题)

    AC自动机模版题: 方法一:超时 #include<iostream> #include<algorithm> #include<cstring> #include ...

  6. hdu 3065 AC自动机

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

  7. HDU 6208 AC自动机

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

  8. HDU2222(AC自动机模版题)

    AC自动机是Trie树和KMP的结合物,但是其实KMP在这里体现了思想,而Trie树才是最重要的,要想学懂AC自动机,学习Trie树是必须的,这些是自己在学习AC自动机的个人看法,我也是在网上学习了大 ...

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

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

最新文章

  1. 深入浅出Websocket(二)分布式Websocket集群
  2. linux 启动流程图
  3. 13、ActiveX控件
  4. 备忘:C++基础 -- 数据类型的学习总结
  5. java.lang包—StringBuffer类和StringBuilder类
  6. python3字典平均值_python3基础之字典
  7. 【转】Dubbo_与Zookeeper、SpringMVC整合和使用(负载均衡、容错)
  8. PyQt5菜单添加+事件+状态栏-7
  9. Scrum立会报告+燃尽图(Final阶段第二次)
  10. 使用Windows service创建一个简单的定时器
  11. 费波纳奇数c语言,费波纳切数列用C语言怎么编程
  12. NodeMCU-ESP8266开发(VSCODE+PlatformIO+Arduino框架):第5篇--Blinker_MIOT_MULTI_OUTLE(点灯科技APP+小爱同学控制插座多个插孔)
  13. CVE-2013-5211漏洞整改方法
  14. 计算机未连接到网络,电脑无法连接到网络的处理办法
  15. 运用HTML制作简单效果
  16. [机器学习]基于OpenCV实现最简单的数字识别
  17. 开山斧 V0.3 WIN 版本
  18. vue移动端图片上传
  19. 博世XC事业部李胤:自动驾驶降温不意外,但这条路肯定会走下去
  20. Java——常用开发工具

热门文章

  1. 2022起重机械指挥考试模拟100题及答案
  2. Swift WKWebView详细解读
  3. mysql bytes sent_MySQL服务器状态变量(mysqld)
  4. vue自定义指令基础
  5. java加减法验证码_Java,Springboot 实现算法验证码加减法图形验证码,Kaptcha 实现加减法验证码...
  6. 《无人驾驶》-了解无人驾驶最佳读物
  7. html5课程总结500字,考试后的反思500字(精选10篇)
  8. LV算法和回溯法结合解n后问题
  9. ExaGrid在2021年网络计算大奖评选中大获全胜
  10. c刊计算机领域见刊快的期刊,见刊快的核心期刊_见刊快的核心期刊_好投的医学核心期刊...