题意:

输入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)相关推荐

  1. AC自动机 HDOJ 2222 Keywords Search

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

  2. HDU 2222 Keywords Search【ACAM】

    HDU 2222 Kerwords Search 代码风格模仿自:USETC每周算法讲解,AC自动机,郭老师! 输入一个T,对于每一个T给你一个n,接下来输入P个模式串,然后给你一个L串,L中出现了多 ...

  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 Keywords Search ac自己主动机

    点击打开链接题目链接 Keywords Search Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Ja ...

  8. hdu 2222:Keywords Search

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Total Submissi ...

  9. AC自动机 HDU 2222

    AC自动机分为三部分: 1.构造字典树 2.构找失败指针 3.匹配 解决的问题: 如给你n个单词,然后一篇问章,问你这篇文章中单词出现了多少次? View Code /* 程序说明:多模式串匹配的AC ...

  10. HDU 2222 Keywords Search

    HDU_2222 今天开始学AC自动机了,这个就是我AC自动机的处女作了.这个题有个小trick就是单词列表中可能有重复的单词,但这些重复的单词应看做不同的,因此建字典树时做标记的时候,把原来的赋值为 ...

最新文章

  1. C#中虚函数,抽象,接口的简单说明
  2. 如何把html转换pdf,怎么把html转换成pdf
  3. iMeta期刊纸质版开始免费订阅(包邮)——第一期创刊收藏版
  4. Nginx 禁止某 IP 访问
  5. C# 在DataGridView中,点击单元格调出 TreeView控件 或 ListBox控件
  6. Java跨平台实现原理及JVM垃圾回收、内存管理实战
  7. 全球及中国汽车涂料市场盈利预测与发展策略分析报告2022版
  8. java 中组合与复用_Java 代码复用(组合与继承)
  9. 外挂学习之路(14)--- 游戏中的二叉树
  10. python3.8.3好用吗_python使用3.8.3版本,存在报错
  11. cocos2D icon
  12. EasyPlayer.js H5播放器帮助我这种不会前端的普通用户也能轻松实现直播接入
  13. Word查找重复的内容
  14. 24位掩码和30个掩码_高级ds位掩码和dp的问题
  15. RK987蓝牙键盘使用说明书分享
  16. 热衷于摸鱼的大一新生
  17. 用计算机画函数图象,信息技术应用 用计算机画函数图象 .doc
  18. matlab中三角函数sin、cos、tan以弧度为单位
  19. GPON标准简要解析
  20. 图卷积神经网络 | Python实现基于GCN-GRU图卷积门控循环单元网络模型

热门文章

  1. python和java选择哪个-JAVA和Python哪个好就业?
  2. python基础教程廖雪峰云-Python 基础教程
  3. python是什么-马哥教育官网-专业Linux培训班,Python培训机构
  4. python编程100例-Python3经典100例(①)
  5. 零基础学python图文版-零基础学Python(图文版)
  6. 做好嘈杂环境的语音识别,目前难点主要在哪里?
  7. 前端工程化(Vue-cli3和Element-ui)
  8. 【java笔记】Stream流(1)你知道什么叫Stream流吗?
  9. MediaInfo源代码分析 4:Inform()函数
  10. python谱聚类算法_谱聚类 - python挖掘 - 博客园