题意:给定n个单词,一个字符串,问字符串中出现了多少个单词。

解题关键:AC自动机模板题,注意根据题意,匹配完成之后要置0.

注意char数组也可以用cin,

注意理解AC自动机,不可能在同一层 出现两个相同的前缀,不然会合并在一起的,所以一定会分层,所以可以依靠fail指针递归寻找。

AC自动机最重要的地方在于 用后缀来匹配前缀

复杂度:$O(NS + T)$

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 const int N=26;
 5 const int MAXN=520000;
 6 struct Trie{//数组形式
 7     int Next[MAXN][N],Fail[MAXN],End[MAXN],root,tot;//大小为所以匹配字符串的总和
 8     int newnode(){//结构体内部用
 9         for(int i=0;i<N;i++) Next[tot][i]=-1;
10         End[tot++]=0;
11         return tot-1;
12     }
13     void init(){
14         tot=0;
15         root=newnode();
16     }
17     void insert(char buf[]){
18         int len=strlen(buf);
19         int now=root;//now是temp指针
20         for(int i=0;i<len;i++){
21             int k=buf[i]-'a';
22             if(Next[now][k]==-1)  Next[now][k]=newnode();//next数组代表的是下一个字符索引
23             now=Next[now][k];
24         }
25         End[now]++;//end数组是当前字符串的个数.字典中可能有相同的单词,若只算一次,改为1.
26     }
27     void build(){//构造fail指针,后缀是某些前缀
28         queue<int>que;
29         Fail[root]=root;
30         for(int i=0;i<N;i++){
31             if(Next[root][i]==-1) Next[root][i]=root;
32             else{
33                 Fail[Next[root][i]]=root;
34                 que.push(Next[root][i]);
35             }
36         }
37         while(!que.empty()){//bfs,会将所有的匹配子串都遍历到
38             int now=que.front();
39             que.pop();
40             for(int i=0;i<N;i++){
41                 if(Next[now][i]==-1) Next[now][i]=Next[Fail[now]][i];
42                 else{
43                     Fail[Next[now][i]]=Next[Fail[now]][i];
44                     que.push(Next[now][i]);
45                 }
46             }
47         }
48     }
49     int query(char buf[]){
50         int len=strlen(buf),now=root,res=0;
51         for(int i=0;i<len;i++){
52             now=Next[now][buf[i]-'a'];
53             int temp=now;
54             while(temp!=root){
55                 res+=End[temp];
56                 End[temp]=0;//模式串只在主串中匹配一次就可以了,若匹配次数算作n次,次数不必置0
57                 temp=Fail[temp];
58             }
59         }
60         return res;
61     }
62 };
63 Trie ac;
64 char buf[1000003];
65 int main(){
66     int T,n;
67     ios::sync_with_stdio(0);
68     cin>>T;
69     while(T--){
70         ac.init();
71         cin>>n;
72         for(int i=0;i<n;i++){
73             cin>>buf;
74             ac.insert(buf);
75         }
76         ac.build();//不要忘记build
77         cin>>buf;
78         int ans=ac.query(buf);
79         cout<<ans<<"\n";
80     }
81     return 0;
82 } 

转载于:https://www.cnblogs.com/elpsycongroo/p/7503090.html

[hdu2222]Keywords Search(AC自动机)相关推荐

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

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

  2. Keywords Search AC自动机QAQ

    AC自动机,一直以来都以为是一个非常高大上的算法,其实它还真的挺高大上的. 首先来说,ac自动机的思想与kmp类似,需要自己模拟来理解. 给两个博客: http://www.cppblog.com/m ...

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

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

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

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

  5. HDU2222 Keywords Search

    题目链接:HDU2222 Keywords Search Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K ...

  6. HDU2222 Keywords Search(AC自动机模板)

    AC自动机是一种多模式匹配的算法.大概过程如下: 首先所有模式串构造一棵Trie树,Trie树上的每个非根结点都代表一个从根出发到该点路径的字符串. 然后每个结点都计算出其fail指针的值,这个fai ...

  7. hdu 2222 Keywords Search ac自己主动机

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

  8. HUD2222 Keywords Serch AC自动机

    传送门 显然这是一道AC自动机的模板题 但是还有一些地方需要注意: 1.多组数据要每次清空数组 2.关键字重复要累加,但是文本重复不能累加,可以打标记解决 #include<cstdio> ...

  9. hdu2222 Keywords Search(ACAM)

    模板题. #include <cstdio> #include <cstring> #include <algorithm> #include <queue& ...

最新文章

  1. 一天一算法:快速排序
  2. 摘录cocos2d-x 从环境搭建到win32项目移植android平台
  3. 基于情感脑电信号时-频-空特征的3D密集连接网络
  4. 01 c++常见面试题总结
  5. Equipment download - No data contained in BDoc
  6. WindowsAPI-Findwindow函数和FindWindowEx用法
  7. 细数那些你可能不知道的国产数据库
  8. 两篇讲述Skinned Mesh原理的文章
  9. 【Java】JSON数据交换格式及其使用案例(聊天工具)
  10. 蓝桥集训之BFS、DFS和链式前向星
  11. js 图片浏览插件原生
  12. SEO助手-免费万能SEO网站优化小助手
  13. Navicat无法导入excel文件的异常处理
  14. 正则表达式小Tips
  15. 消息中间件MQ与RabbitMQ
  16. 补充设定 timer1 定时器和 timer2 定时器定时做多件事
  17. 汇集了很多swift 学习指南
  18. 渲染是不是很费电脑,云渲染对电脑的要求高吗?
  19. 海尔消费金融“增收不增利”:利润不及两年前,曾多次被点名批评
  20. 程序猿的自救 从零备考NSCA/CSCS 2 阻力运动生物力学

热门文章

  1. ado.not--综合练习
  2. 操作手机数据库的uri
  3. Linux下安装Oracle11g服务器
  4. LeetCode(520)——检测大写字母(JavaScript)
  5. 【Vue2.0】—Vue监视数据的原理(五)
  6. JavaScript学习(十六)—实现购物车加减数量,计算总金额
  7. Codeforces Round #628 (Div. 2)C - Ehab and Path-etic MEXs
  8. 怎么查询房贷批下来没?
  9. 游戏党,iQOO Neo5这部手机能玩目前流行的大型手游吗?
  10. 想要创业有没有过来人能够指导一下