AC自动机分为三部分:

1.构造字典树

2.构找失败指针

3.匹配

解决的问题: 如给你n个单词,然后一篇问章,问你这篇文章中单词出现了多少次?

View Code

/*
程序说明:多模式串匹配的AC自动机算法
此题通过hdu 2222
自动机算法可以参考《柔性字符串匹配》里的相应章节,讲的很清楚
*/
#include <stdio.h>
#include <string.h>const  int MAXQ = 500000+10;
const  int MAXN = 1000000+10;
const  int MAXK = 26;  //自动机里字符集的大小
struct  TrieNode
{TrieNode* fail;TrieNode* next[MAXK];bool danger;   //该节点是否为某模式串的终结点 int  cnt;    //以该节点为终结点的模式串个数
    TrieNode(){fail = NULL;memset(next, NULL, sizeof(next));danger = false;cnt = 0;}
}*que[MAXQ], *root;
//文本字符串
char  msg[MAXN];
int   N;
void  TrieInsert(char *s)
{int  i = 0;TrieNode *ptr = root;while(s[i]){int  idx = s[i]-'a';if(ptr->next[idx] == NULL)ptr->next[idx] = new TrieNode();ptr = ptr->next[idx];i++;}ptr->danger = true;ptr->cnt++;
}void  Init()
{int  i;char  s[100];root = new TrieNode();scanf("%d", &N);for(i = 0; i < N; i++){scanf("%s", s);TrieInsert(s);}
}void  Build_AC_Automation()
{int  rear = 1, front = 0, i;que[0] = root;root->fail = NULL;while(rear != front){TrieNode *cur = que[front++];for(i = 0; i < 26; i++)if(cur->next[i] != NULL){if(cur == root)cur->next[i]->fail = root;else{TrieNode *ptr = cur->fail;  //改指针父亲失败指针 while(ptr != NULL){if(ptr->next[i] != NULL){cur->next[i]->fail = ptr->next[i];if(ptr->next[i]->danger == true)cur->next[i]->danger = true;break;}ptr = ptr->fail;}if(ptr == NULL) cur->next[i]->fail = root;}que[rear++] = cur->next[i];}}
}int  AC_Search()
{int  i = 0, ans = 0;TrieNode *ptr = root;while(msg[i]){int  idx = msg[i]-'a';while(ptr->next[idx] == NULL && ptr != root) ptr = ptr->fail; //匹配不到就指向其失败指针 ptr = ptr->next[idx];if(ptr == NULL) ptr = root; //等于空指针也返回其失败指针 TrieNode *tmp = ptr;while(tmp != NULL && tmp->cnt != -1){ans += tmp->cnt;tmp->cnt = -1;tmp = tmp->fail;}i++;}return  ans;
}int  main()
{int  T;scanf("%d", &T);while(T--){Init();Build_AC_Automation();//文本 scanf("%s", msg);printf("%d\n", AC_Search());}return 0;
}

转载于:https://www.cnblogs.com/tangcong/archive/2012/08/08/2627574.html

AC自动机 HDU 2222相关推荐

  1. AC自动机 HDU 2222

    t n个字串 1个母串 求出现几个字串 字串可能重复 #include<stdio.h> #include<algorithm> #include<string.h> ...

  2. AC自动机 HDOJ 2222 Keywords Search

    题目链接 题意:每个文本串的出现次数 分析:入门题,注意重复的关键字算不同的关键字,还有之前加过的清零.   新模板,加上last跑快一倍 #include <bits/stdc++.h> ...

  3. hdu 2222 Keywords Search(ac自动机)

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=2222 题意:给你一系列子串,再给你一个主串问你主串一共有几个匹配子串 原来使用字典树写的但数据有点大T ...

  4. hdu 2222 Keywords Search AC自动机——多串匹配

    http://acm.hdu.edu.cn/showproblem.php?pid=2222 题意: 给出n个单词,再给出一段包含m个字符的文章,求有多少个单词在文章里出现过. 思路: 才开开始以为简 ...

  5. HDU 2222 Keywords Search (AC自动机模板题)

    一组数据: 1 3 sss sss sss sss ans:3 #include <cstdio> #include <cstdlib> #include <vector ...

  6. HDU - 2222 Keywords Search(AC自动机)

    题目链接:点击查看 题目大意:给出n个长度不超过50的模式串,再给出一个长度不超过1e6的主串,问模式串在主串中出现过多少次 题目分析:一开始我以为是求n次KMP,后来才知道这样做的时间复杂度是O(L ...

  7. hdu 2222 ac自动机

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

  8. HDU 2222 AC自动机

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

  9. Keywords Search HDU - 2222(AC自动机模板)

    题意: 给定 n个长度不超过 50的由小写英文字母组成的单词准备查询,以及一篇文章,问:文中出现了多少个待查询的单词.多组数据. 题目: In the modern time, Search engi ...

最新文章

  1. 共话数据智能新经济,首届市北·GMIS 2019全球数据智能峰会隆重召开
  2. Vivado中ASYNC_REG命令讲解
  3. luogu 2014 选课 树上背包
  4. arthas类和类加载器相关命令:dump、classloader
  5. pythonunittest接口测试_基于python+unittest +requests接口测试
  6. jpg图片使用pil的resize后_如何使用PIL调整图像大小并保持其纵横比?
  7. ajax then jquery,使用Jquery.ajax()。then()时无法.catch()错误
  8. 1000道Python题库系列分享20(43道填空与判断题)
  9. Python开发入门与实战14-基于Extjs的界面
  10. 教你如何判断水泥的质量好坏?
  11. RouterOS安装以及搭建DHCP PPPoE PPTP L2TP服务
  12. Movie Studio插入的素材支持什么格式?
  13. Ansible+Redfish+Idrac管理DELL服务器
  14. cass生成里程文件桩号不全,cass生成桩号
  15. 南京邮电大学离散数学实验一(求主析取和主合取范式)
  16. 腾讯抄袭之史 当之无愧的剽窃之王【最近剽窃 qq空间时间轴 VS 钥匙网】
  17. 强对偶性、弱对偶性以及KKT条件的证明(对偶问题的几何证明)
  18. 发那科2021参数_发那科参数
  19. 图形学 ---- 二维几何变换(二维图形矩阵平移,旋转,缩放)
  20. Java集合面试题整理(超详细)

热门文章

  1. linux中nfs存储权限,NFS权限管理 - 麦苗的个人空间 - OSCHINA - 中文开源技术交流社区...
  2. win7为什么打开桌面上的计算机很卡很慢,如何解决win7系统电脑反应慢
  3. java生成excel中文乱码,JSP应用导出Excel报表的简单实现以及中文乱码彻底解决(HTML)...
  4. labelImg标注工具(win10安装)
  5. python的while分支
  6. 高光谱成像技术在茶叶中的应用研究进展
  7. java 注解 runtime_自定义注解之运行时注解(RetentionPolicy.RUNTIME)
  8. mupdf嵌入 html页面,MuPDF Command Line Tools
  9. 高级php程序员,php高级程序员该学什么
  10. android充电器 充苹果,安卓充电器能给iPhone 12快充吗?实测小惊喜