AC自动机 HDU 2222
AC自动机分为三部分:
1.构造字典树
2.构找失败指针
3.匹配
解决的问题: 如给你n个单词,然后一篇问章,问你这篇文章中单词出现了多少次?
![](/assets/blank.gif)
![](/assets/blank.gif)
/* 程序说明:多模式串匹配的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相关推荐
- AC自动机 HDU 2222
t n个字串 1个母串 求出现几个字串 字串可能重复 #include<stdio.h> #include<algorithm> #include<string.h> ...
- AC自动机 HDOJ 2222 Keywords Search
题目链接 题意:每个文本串的出现次数 分析:入门题,注意重复的关键字算不同的关键字,还有之前加过的清零. 新模板,加上last跑快一倍 #include <bits/stdc++.h> ...
- hdu 2222 Keywords Search(ac自动机)
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=2222 题意:给你一系列子串,再给你一个主串问你主串一共有几个匹配子串 原来使用字典树写的但数据有点大T ...
- hdu 2222 Keywords Search AC自动机——多串匹配
http://acm.hdu.edu.cn/showproblem.php?pid=2222 题意: 给出n个单词,再给出一段包含m个字符的文章,求有多少个单词在文章里出现过. 思路: 才开开始以为简 ...
- HDU 2222 Keywords Search (AC自动机模板题)
一组数据: 1 3 sss sss sss sss ans:3 #include <cstdio> #include <cstdlib> #include <vector ...
- HDU - 2222 Keywords Search(AC自动机)
题目链接:点击查看 题目大意:给出n个长度不超过50的模式串,再给出一个长度不超过1e6的主串,问模式串在主串中出现过多少次 题目分析:一开始我以为是求n次KMP,后来才知道这样做的时间复杂度是O(L ...
- hdu 2222 ac自动机
对于ac自动机的具体内容,请看如下博客:http://www.cppblog.com/mythit/archive/2009/04/21/80633.html 写的挺好的. 要了解ac自动机就要先知道 ...
- HDU 2222 AC自动机
AC自动机模板题. 什么是Fai指针,指向出现了的最长后缀. 怎么统计,匹配到了模式串,但是,是仅仅一个当前的节点数吗? 不是的,还要继续往Fail指针上走,统计所有的cnt之和. 这个题目设计到,每 ...
- Keywords Search HDU - 2222(AC自动机模板)
题意: 给定 n个长度不超过 50的由小写英文字母组成的单词准备查询,以及一篇文章,问:文中出现了多少个待查询的单词.多组数据. 题目: In the modern time, Search engi ...
最新文章
- 共话数据智能新经济,首届市北·GMIS 2019全球数据智能峰会隆重召开
- Vivado中ASYNC_REG命令讲解
- luogu 2014 选课 树上背包
- arthas类和类加载器相关命令:dump、classloader
- pythonunittest接口测试_基于python+unittest +requests接口测试
- jpg图片使用pil的resize后_如何使用PIL调整图像大小并保持其纵横比?
- ajax then jquery,使用Jquery.ajax()。then()时无法.catch()错误
- 1000道Python题库系列分享20(43道填空与判断题)
- Python开发入门与实战14-基于Extjs的界面
- 教你如何判断水泥的质量好坏?
- RouterOS安装以及搭建DHCP PPPoE PPTP L2TP服务
- Movie Studio插入的素材支持什么格式?
- Ansible+Redfish+Idrac管理DELL服务器
- cass生成里程文件桩号不全,cass生成桩号
- 南京邮电大学离散数学实验一(求主析取和主合取范式)
- 腾讯抄袭之史 当之无愧的剽窃之王【最近剽窃 qq空间时间轴 VS 钥匙网】
- 强对偶性、弱对偶性以及KKT条件的证明(对偶问题的几何证明)
- 发那科2021参数_发那科参数
- 图形学 ---- 二维几何变换(二维图形矩阵平移,旋转,缩放)
- Java集合面试题整理(超详细)
热门文章
- linux中nfs存储权限,NFS权限管理 - 麦苗的个人空间 - OSCHINA - 中文开源技术交流社区...
- win7为什么打开桌面上的计算机很卡很慢,如何解决win7系统电脑反应慢
- java生成excel中文乱码,JSP应用导出Excel报表的简单实现以及中文乱码彻底解决(HTML)...
- labelImg标注工具(win10安装)
- python的while分支
- 高光谱成像技术在茶叶中的应用研究进展
- java 注解 runtime_自定义注解之运行时注解(RetentionPolicy.RUNTIME)
- mupdf嵌入 html页面,MuPDF Command Line Tools
- 高级php程序员,php高级程序员该学什么
- android充电器 充苹果,安卓充电器能给iPhone 12快充吗?实测小惊喜