洛谷--P3808 【模板】AC自动机(“假的“简单版)
如果你想要做出这道题,你需要先了解两个知识点:
1、字典树的构造
2、KMP算法(也就是fail指针的构造)
对于字典树,可以看看这个大佬:
https://www.cnblogs.com/TheRoadToTheGold/p/6290732.html
对于KMP,可以看看这个大佬:
https://www.cnblogs.com/SYCstudio/p/7194315.html#4255259 (强烈推荐!!!!)
代码实现步骤:(前两个步骤是AC自动机的必备)
1、利用所提供的模式串构造字典树
2、构造fail指针,即当前节点的fail指针 = 它的父节点fail所指向的节点 所指向的相同子节点。,对于定义fail指针的值,借用queue队列的先进先出的思想(此处为难点,不明白的请到评论区)
3、依题意构造query函数,返回个数ans
AC代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e6+;
char t[maxn],s[maxn];
struct tree
{
int fail;//失配指针
int son[];//一个节点最多有26个子节点
int num;//标记以此节点为结尾
}DFA[maxn]; //字典树
int cnt=;
void build(string s)
{
int now=;//字典树当前指针
for(int i=;i<s.length();++i)
{
if(DFA[now].son[s[i]-'a']==) //树上没有这个子节点
DFA[now].son[s[i]-'a']=++cnt; //新增一个节点
now=DFA[now].son[s[i]-'a']; //向下构造
}
DFA[now].num+=;// 标记单词的结尾
}
void Get_fail() //构造fail指针
{
queue<int> Q;
for(int i=;i<;++i)
{
if(DFA[].son[i]!=)
{
DFA[DFA[].son[i]].fail=;//指向根节点,第二层
Q.push(DFA[].son[i]); //压入队列
}
}
while(!Q.empty())
{
int u=Q.front();
Q.pop();
for(int i=;i<;++i) //后面的层
{
if(DFA[u].son[i]!=)//如果存在此节点
{
DFA[DFA[u].son[i]].fail=DFA[DFA[u].fail].son[i];//指向该节点的父节点的fail值对应的节点的相同子节点
Q.push(DFA[u].son[i]); //加入队列
}
else //如果不存在这个节点
{
DFA[u].son[i]=DFA[DFA[u].fail].son[i]; //当前节点的孩子节点指向当前节点的fail的孩子节点
}
}
}
}
int query(char *s)
{
int len=strlen(s);
int now=,ans=;
for(int i=;i<len;++i)
{
now=DFA[now].son[s[i]-'a'];
for(int t=now;t!=&&DFA[now].num!=-;++t)
{
if(DFA[now].num>) //表示存在结尾
ans+=DFA[now].num;
DFA[t].num=-; //标记已访问过
}
}
return ans;
} int main()
{
int n;
scanf("%d",&n);
for(int i=;i<n;i++)
{
scanf("%s",t);
build(t);
}
Get_fail();
scanf("%s",s);
int ans=query(s);
printf("%d\n",ans);
return ;
}
AC自动机不好理解,原谅我比较懒,没有给大家一个满意的解析,不过大家有问题可以评论区私我,我会尽力为大家解答的!
洛谷--P3808 【模板】AC自动机(“假的“简单版)的更多相关文章
- 洛谷P3808 & P3796 AC自动机模板
题目:P3808:https://www.luogu.org/problemnew/show/P3808 P3796:https://www.luogu.org/problemnew/show/P37 ...
- luoguP3808[模板]AC自动机(简单版)
传送门 ac自动机模板题,裸的多串匹配 代码: #include<cstdio> #include<iostream> #include<algorithm> #i ...
- 模板】AC自动机(简单版)
模板]AC自动机(简单版) https://www.luogu.org/problemnew/show/P3808 这是一道简单的AC自动机模板题. 用于检测正确性以及算法常数. 为了防止卡OJ,在保 ...
- 【模版】AC自动机(简单版)
题目背景 这是一道简单的AC自动机模版题. 用于检测正确性以及算法常数. 为了防止卡OJ,在保证正确的基础上只有两组数据,请不要恶意提交. 题目描述 给定n个模式串和1个文本串,求有多少个模式串在文本 ...
- AC自动机(简单版)(施工ing)
声明 想看加强版的戳这里(施工ing,作者正努力中)~ 先贴题目吧哎~ AC自动机加强版 洛谷 P3796 题目: 洛谷 P3808 (数据范围困了我好久 TAT) 反正涉及字符串的算法都很玄学 ...
- 洛谷P3808 【模板】AC自动机(简单版)
题目背景 这是一道简单的AC自动机模板题. 用于检测正确性以及算法常数. 为了防止卡OJ,在保证正确的基础上只有两组数据,请不要恶意提交. 管理员提示:本题数据内有重复的单词,且重复单词应该计算多次, ...
- 【刷题】洛谷 P3808 【模板】AC自动机(简单版)
题目背景 这是一道简单的AC自动机模板题. 用于检测正确性以及算法常数. 为了防止卡OJ,在保证正确的基础上只有两组数据,请不要恶意提交. 管理员提示:本题数据内有重复的单词,且重复单词应该计算多次, ...
- 洛谷 P3808 【模板】AC自动机(简单版)
传送门:https://www.luogu.org/problem/P3808 题解:是一个AC自动机的裸题了,注释加在代码里面了 #include<bits/stdc++.h> usin ...
- 洛谷 P3808 【模板】AC自动机(简单版) 题解
原题链接 前置知识: 字典树.(会 \(\texttt{KMP}\) 就更好) 显然呢,本题用 字典树 和 \(\texttt{KMP}\) 无法解决问题. 所以我们发明了一个东西: \(\textt ...
- [洛谷3808]【模板】AC自动机(简单版)
题目大意: 给定$n$个模式串$p(\sum|p_i|\le10^6)$和一个$t(|t|\le10^6)$,求在$t$中被匹配的$p$的个数. 思路: AC自动机模板题,注意$t$中一个字符可能对应 ...
随机推荐
- 快站中如果点击报错,则用jquery的点击方式来书写!!!
如题 上传快站常用的css /* 上传快站额外的css */ .sys-title-1 { display: none !important; } .nav-header { height: 0 !i ...
- The Ultimate Guide to handling JWTs on frontend clients (GraphQL)
转自:https://blog.hasura.io/best-practices-of-using-jwt-with-graphql/ hasura 团队关于jwt 的实践 JWTs (JSON We ...
- 将两个各有n个元素的有序表归并成一个有序表,其最多的比较次数
最多的比较次数是当两个有序表的数据刚好是插空顺序的时候,比如:第一个序列是1,3,5,第二个序列是2,4,6,把第二个序列插入到第一个序列中,先把第二个序列中的第一个元素2和第一个序列依次比较,需要比 ...
- bzoj3676 [Apio2014]回文串 卡常+SAM+树上倍增
bzoj3676 [Apio2014]回文串 SAM+树上倍增 链接 bzoj luogu 思路 根据manacher可以知道,每次暴力扩展才有可能出现新的回文串. 所以推出本质不同的回文串个数是O( ...
- AtCoder刷题记录
构造题都是神仙题 /kk ARC066C Addition and Subtraction Hard 首先要发现两个性质: 加号右边不会有括号:显然,有括号也可以被删去,答案不变. \(op_i\)和 ...
- proxmox之cloud-init
Cloud-Init支持 Cloud-Init是事实上的多分发包,它处理虚拟机实例的早期初始化.使用Cloud-Init,可以在虚拟机管理程序端配置网络设备和ssh密钥.当VM首次启动时,VM内的Cl ...
- ubuntu笔记2-误删dpkg的/var/lib/dpkg/info文件夹
由于误删了dpkg的/var/lib/dpkg/info文件夹,导致安装文件的时候报错 错误提示:E: Sub-process /usr/bin/dpkg returned an error code ...
- “未在本地计算机上注册“Microsoft.Jet.OLEDB.4.0”提供程序
一.背景: 开发一个工具的小项目,因为数据少,我就不想安装sqlserver数据库,就用Access数据库. 二.问题: 在客户安装程序的时候,接口访问Access数据库的时候,报错“未在本地计算机上 ...
- [技术博客]React Native——HTML页面代码高亮&数学公式解析
问题起源 原有博文显示时代码无法高亮,白底黑字的视觉效果不好. 原有博文中无法解析数学公式,导致页面会直接显示数学公式源码. 为了解决这两个问题,尝试了一些方法,最终利用开源类库实现了页面美化. (失 ...
- 【Node.js】Node.js的调试
目录结构: contents structure [-] 使用console.log() 使用Chrome DevTools 使用Visual Studio Code 与JavaScript运行在浏览 ...