题面

Description

对,这就是裸的AC自动机。
要求:在规定时间内统计出模版字符串在文本中出现的次数。

Input

第一行:模版字符串的个数N。
第2->N+1行:N个字符串。(每个模版字符串的长度<=50)
第N+2行:一行很长的字符串。长的很。(使用AC自动机能在1s内计算出)

Output

共N行,每行输出一个模版及出现的次数。(之间有一个空格,按照输入顺序输出)

Sample Input

4
hers
her
his
she
shershisher

Sample Output

hers 1
her 2
his 1
she 2

Hint

所有字母均为小写
所给模版不会重复

题解

和前面Luogu那一道AC自动机的模板相同
只是要求解的东西不同。
到时候写完了AC自动机的详解再来粘链接

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<queue>
#include<algorithm>
using namespace std;
struct Tree//字典树
{int fail;//失配指针int vis[26];//子节点的位置int end;//标记以这个节点结尾的单词编号
}AC[1000000];//Trie树
int cnt=0;//Trie的指针
int Ans[1000000];//所有单词的出现次数
string s[1000000];
inline void Build(string s,int Num)
{int l=s.length();int now=0;//字典树的当前指针 for(int i=0;i<l;++i)//构造Trie树{if(AC[now].vis[s[i]-'a']==0)//Trie树没有这个子节点AC[now].vis[s[i]-'a']=++cnt;//构造出来now=AC[now].vis[s[i]-'a'];//向下构造 }AC[now].end=Num;//标记单词结尾
}
void Get_fail()//构造fail指针
{queue<int> Q;//队列 for(int i=0;i<26;++i)//第二层的fail指针提前处理一下{if(AC[0].vis[i]!=0){AC[AC[0].vis[i]].fail=0;//指向根节点Q.push(AC[0].vis[i]);//压入队列 }}while(!Q.empty())//BFS求fail指针 {int u=Q.front();Q.pop();for(int i=0;i<26;++i)//枚举所有子节点{if(AC[u].vis[i]!=0)//存在这个子节点{AC[AC[u].vis[i]].fail=AC[AC[u].fail].vis[i];//子节点的fail指针指向当前节点的//fail指针所指向的节点的相同子节点 Q.push(AC[u].vis[i]);//压入队列 }else//不存在这个子节点 AC[u].vis[i]=AC[AC[u].fail].vis[i];//当前节点的这个子节点指向当//前节点fail指针的这个子节点 }}
}
int AC_Query(string s)//AC自动机匹配
{int l=s.length();int now=0,ans=0;for(int i=0;i<l;++i){now=AC[now].vis[s[i]-'a'];//向下一层for(int t=now;t;t=AC[t].fail)//循环求解Ans[AC[t].end]++;}return ans;
}
int main()
{int n;cin>>n;for(int i=1;i<=n;++i){cin>>s[i];Build(s[i],i);}AC[0].fail=0;//结束标志 Get_fail();//求出失配指针cin>>s[0];//文本串 AC_Query(s[0]);for(int i=1;i<=n;++i){cout<<s[i]<<' ';cout<<Ans[i]<<endl;}return 0;
}

AC自动机模板(【CJOJ1435】)相关推荐

  1. 数单词 (AC自动机模板题)

    数单词 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 为了能够顺利通过英语四六级考试,现在大家每天早上都会早起读英语. LYH本来以为自己在6月份的考试中可以通过六级, ...

  2. NYOJ 1085 数单词 (AC自动机模板题)

    数单词 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 为了能够顺利通过英语四六级考试,现在大家每天早上都会早起读英语. LYH本来以为自己在6月份的考试中可以通过六级, ...

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

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

  4. [Bzoj3940] [AC自动机,USACO 2015 February Gold] Censor [AC自动机模板题]

    AC自动机模板题(膜jcvb代码) 1 #include <iostream> 2 #include <algorithm> 3 #include <cstdio> ...

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

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

  6. AC自动机模板(【洛谷3808】)

    题面 题目背景 这是一道简单的AC自动机模版题. 用于检测正确性以及算法常数. 为了防止卡OJ,在保证正确的基础上只有两组数据,请不要恶意提交. 题目描述 给定n个模式串和1个文本串,求有多少个模式串 ...

  7. HDU 2222(AC自动机模板)

    AC自动机这个算法网上有很多资料,这里就不多赘述了. 当从一个字符串中查找另一个字符串,我们有快速的算法KMP. 现在的问题是要从一个字符串中查找很多字符串,或者要从多个字符串里分别查找很多字符串.A ...

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

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

  9. 关键词匹配(Ac自动机模板题)

    2772: 关键词匹配 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 10  Solved: 4 [Submit][Status][Web Board ...

最新文章

  1. 快手超大规模集群调度优化实践
  2. 安装 express4 linux,nodejs+express4.0+mongodb安装方法 for Linux, Mac
  3. require demo 记录备份
  4. 饱和气压与温度的关系_凯米斯小课堂 | 溶解氧与水产养殖的关系
  5. Appium 命令行安装教程
  6. JSON对象和JSON 字符串之间的相互转换
  7. iOS 开发中需要注意的小地方
  8. 广州科目三考试 不得不看的十条提醒(图)
  9. Nginx部署前后端分离项目,配置SSL证书,结果刷新报500异常
  10. C++ #pragma once用法总结
  11. python爬虫--不限平台歌曲下载(收费也可)
  12. android studio Statistic插件不显示
  13. Newzoo伽马数据发布《元宇宙全球发展报告》 元境多项领先技术受关注
  14. JavaScript通过extend和super实现继承
  15. jq获取span标签的赋值和取值
  16. windows系统nginx重启发生异常
  17. 【智能零售】解读双11后的新零售趋势
  18. DataStage(ETL)技术总结 -- 介绍篇
  19. 详解Unity中的车轮碰撞器Wheel Collider
  20. 为什么 A 能 ping 通 B,B 却不能 ping 通 A ?

热门文章

  1. 非北京户口,户口地买房提取公积金
  2. hadoop1.2.1+zookeeper3.4.6+hbase0.94集群环境搭建
  3. 好莱坞明星识别-第六周
  4. 除了中国知网和谷歌文学还有哪些好的有权威的资源站?
  5. 提升职场表现力:讯飞智能录音笔SR901实力优选
  6. 2019年“网红”芯片大盘点,哪一颗让你印象最深刻?
  7. Linux杀掉挖矿病毒(qW3xT.2)
  8. 什么是推特群控?推特群控的优势是什么?
  9. java实现24点计算
  10. 读取第n行python_Python如何一次读取N行