AC自动机模板(【CJOJ1435】)
题面
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】)相关推荐
- 数单词 (AC自动机模板题)
数单词 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 为了能够顺利通过英语四六级考试,现在大家每天早上都会早起读英语. LYH本来以为自己在6月份的考试中可以通过六级, ...
- NYOJ 1085 数单词 (AC自动机模板题)
数单词 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 为了能够顺利通过英语四六级考试,现在大家每天早上都会早起读英语. LYH本来以为自己在6月份的考试中可以通过六级, ...
- Keywords Search HDU - 2222(AC自动机模板)
题意: 给定 n个长度不超过 50的由小写英文字母组成的单词准备查询,以及一篇文章,问:文中出现了多少个待查询的单词.多组数据. 题目: In the modern time, Search engi ...
- [Bzoj3940] [AC自动机,USACO 2015 February Gold] Censor [AC自动机模板题]
AC自动机模板题(膜jcvb代码) 1 #include <iostream> 2 #include <algorithm> 3 #include <cstdio> ...
- HDU2222 Keywords Search(AC自动机模板)
AC自动机是一种多模式匹配的算法.大概过程如下: 首先所有模式串构造一棵Trie树,Trie树上的每个非根结点都代表一个从根出发到该点路径的字符串. 然后每个结点都计算出其fail指针的值,这个fai ...
- AC自动机模板(【洛谷3808】)
题面 题目背景 这是一道简单的AC自动机模版题. 用于检测正确性以及算法常数. 为了防止卡OJ,在保证正确的基础上只有两组数据,请不要恶意提交. 题目描述 给定n个模式串和1个文本串,求有多少个模式串 ...
- HDU 2222(AC自动机模板)
AC自动机这个算法网上有很多资料,这里就不多赘述了. 当从一个字符串中查找另一个字符串,我们有快速的算法KMP. 现在的问题是要从一个字符串中查找很多字符串,或者要从多个字符串里分别查找很多字符串.A ...
- HDU 2222 Keywords Search (AC自动机模板题)
一组数据: 1 3 sss sss sss sss ans:3 #include <cstdio> #include <cstdlib> #include <vector ...
- 关键词匹配(Ac自动机模板题)
2772: 关键词匹配 Time Limit: 1 Sec Memory Limit: 128 MB Submit: 10 Solved: 4 [Submit][Status][Web Board ...
最新文章
- 快手超大规模集群调度优化实践
- 安装 express4 linux,nodejs+express4.0+mongodb安装方法 for Linux, Mac
- require demo 记录备份
- 饱和气压与温度的关系_凯米斯小课堂 | 溶解氧与水产养殖的关系
- Appium 命令行安装教程
- JSON对象和JSON 字符串之间的相互转换
- iOS 开发中需要注意的小地方
- 广州科目三考试 不得不看的十条提醒(图)
- Nginx部署前后端分离项目,配置SSL证书,结果刷新报500异常
- C++ #pragma once用法总结
- python爬虫--不限平台歌曲下载(收费也可)
- android studio Statistic插件不显示
- Newzoo伽马数据发布《元宇宙全球发展报告》 元境多项领先技术受关注
- JavaScript通过extend和super实现继承
- jq获取span标签的赋值和取值
- windows系统nginx重启发生异常
- 【智能零售】解读双11后的新零售趋势
- DataStage(ETL)技术总结 -- 介绍篇
- 详解Unity中的车轮碰撞器Wheel Collider
- 为什么 A 能 ping 通 B,B 却不能 ping 通 A ?
热门文章
- 非北京户口,户口地买房提取公积金
- hadoop1.2.1+zookeeper3.4.6+hbase0.94集群环境搭建
- 好莱坞明星识别-第六周
- 除了中国知网和谷歌文学还有哪些好的有权威的资源站?
- 提升职场表现力:讯飞智能录音笔SR901实力优选
- 2019年“网红”芯片大盘点,哪一颗让你印象最深刻?
- Linux杀掉挖矿病毒(qW3xT.2)
- 什么是推特群控?推特群控的优势是什么?
- java实现24点计算
- 读取第n行python_Python如何一次读取N行