AC自动机(HDU 2222: Keywords Search)
题意:
输入n个单词,再输入一篇文章,判断有多少个单词在文章中出现过
http://blog.csdn.net/niushuai666/article/details/7002823
注释都在代码里
#include<stdio.h>
#include<queue>
#include<string.h>
using namespace std;
struct Trie
{int ans, len, x, now, root, i, loc, temp, next[500005][26], fail[500005], sum[500005];int Newnode() /*申请新的节点,这个节点的位置是loc*/{for(i=0;i<=25;i++) /*初始化当前节点*/next[loc][i] = -1;sum[loc++] = 0; /*节点申请完毕,当前位置loc已被占用,所以让loc+1以便下次申请*/return loc-1; /*返回当前节点位置*/}void Init() /*初始化字典树*/{loc = 0;root = Newnode();}void Update(char a[]) /*字典树的更新*/{int len = strlen(a);int now = root;for(int i=0;i<len;i++){x = a[i]-'a';if(next[now][x]==-1) /*如果下一个字符节点不存在,建立新节点*/next[now][x] = Newnode();now = next[now][x];}sum[now]++; /*sum[k]表示k节点是sum[k]个单词的结尾*/}void Create(){queue<int> q; /*fail[k]的作用:文章如果在k节点匹配失败,则可以跳到fail[k]处继续匹配,这个同理KMP的next[]数组*/fail[root] = root;for(i=0;i<=25;i++){if(next[root][i]==-1)next[root][i] = root;else{fail[next[root][i]] = root; /*初始化根节点与它的所有子节点的失败指针*/q.push(next[root][i]); /*根节点与它的所有子节点(位置loc)进入队列*/}}while(q.empty()==0) /*从字典树的根开始进行广搜*/{now = q.front();q.pop();for(i=0;i<=25;i++){if(next[now][i]==-1) /*k节点的某个子节点不存在,那么可以跳到fail[k]对应的子节点*/next[now][i] = next[fail[now]][i];else{fail[next[now][i]] = next[fail[now]][i]; /*k节点的某个子节点p存在,那么fail[p]就是fail[k]对应相同字符的子节点*/q.push(next[now][i]);}}}}int Query(char a[]){ans = 0;len = strlen(a);now = root;for(i=0;i<len;i++){now = next[now][a[i]-'a'];temp = now;while(temp!=root) /*可能多个节点满足匹配条件,即某个单词后缀为另一个单词的前缀(awigknm的m所在节点可以跳到gknm的m所在节点)*/{ /*↑↑↑KMP的套路↑↑↑*/ans += sum[temp];sum[temp] = 0; /* 文章中出现同样的单词只会被算作一次*/temp = fail[temp];}}return ans;}
};
char str[1000005];
Trie AC;
int main(void)
{int T, i, n;scanf("%d", &T);while(T--){AC.Init();scanf("%d", &n);for(i=1;i<=n;i++){scanf("%s", str);AC.Update(str);}AC.Create();scanf("%s", str);printf("%d\n", AC.Query(str));}return 0;
}
AC自动机(HDU 2222: Keywords Search)相关推荐
- AC自动机 HDOJ 2222 Keywords Search
题目链接 题意:每个文本串的出现次数 分析:入门题,注意重复的关键字算不同的关键字,还有之前加过的清零. 新模板,加上last跑快一倍 #include <bits/stdc++.h> ...
- HDU 2222 Keywords Search【ACAM】
HDU 2222 Kerwords Search 代码风格模仿自:USETC每周算法讲解,AC自动机,郭老师! 输入一个T,对于每一个T给你一个n,接下来输入P个模式串,然后给你一个L串,L中出现了多 ...
- 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 Keywords Search ac自己主动机
点击打开链接题目链接 Keywords Search Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Ja ...
- hdu 2222:Keywords Search
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) Total Submissi ...
- AC自动机 HDU 2222
AC自动机分为三部分: 1.构造字典树 2.构找失败指针 3.匹配 解决的问题: 如给你n个单词,然后一篇问章,问你这篇文章中单词出现了多少次? View Code /* 程序说明:多模式串匹配的AC ...
- HDU 2222 Keywords Search
HDU_2222 今天开始学AC自动机了,这个就是我AC自动机的处女作了.这个题有个小trick就是单词列表中可能有重复的单词,但这些重复的单词应看做不同的,因此建字典树时做标记的时候,把原来的赋值为 ...
最新文章
- C#中虚函数,抽象,接口的简单说明
- 如何把html转换pdf,怎么把html转换成pdf
- iMeta期刊纸质版开始免费订阅(包邮)——第一期创刊收藏版
- Nginx 禁止某 IP 访问
- C# 在DataGridView中,点击单元格调出 TreeView控件 或 ListBox控件
- Java跨平台实现原理及JVM垃圾回收、内存管理实战
- 全球及中国汽车涂料市场盈利预测与发展策略分析报告2022版
- java 中组合与复用_Java 代码复用(组合与继承)
- 外挂学习之路(14)--- 游戏中的二叉树
- python3.8.3好用吗_python使用3.8.3版本,存在报错
- cocos2D icon
- EasyPlayer.js H5播放器帮助我这种不会前端的普通用户也能轻松实现直播接入
- Word查找重复的内容
- 24位掩码和30个掩码_高级ds位掩码和dp的问题
- RK987蓝牙键盘使用说明书分享
- 热衷于摸鱼的大一新生
- 用计算机画函数图象,信息技术应用 用计算机画函数图象 .doc
- matlab中三角函数sin、cos、tan以弧度为单位
- GPON标准简要解析
- 图卷积神经网络 | Python实现基于GCN-GRU图卷积门控循环单元网络模型
热门文章
- python和java选择哪个-JAVA和Python哪个好就业?
- python基础教程廖雪峰云-Python 基础教程
- python是什么-马哥教育官网-专业Linux培训班,Python培训机构
- python编程100例-Python3经典100例(①)
- 零基础学python图文版-零基础学Python(图文版)
- 做好嘈杂环境的语音识别,目前难点主要在哪里?
- 前端工程化(Vue-cli3和Element-ui)
- 【java笔记】Stream流(1)你知道什么叫Stream流吗?
- MediaInfo源代码分析 4:Inform()函数
- python谱聚类算法_谱聚类 - python挖掘 - 博客园