如果你想要做出这道题,你需要先了解两个知识点:

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自动机(“假的“简单版)的更多相关文章

  1. 洛谷P3808 & P3796 AC自动机模板

    题目:P3808:https://www.luogu.org/problemnew/show/P3808 P3796:https://www.luogu.org/problemnew/show/P37 ...

  2. luoguP3808[模板]AC自动机(简单版)

    传送门 ac自动机模板题,裸的多串匹配 代码: #include<cstdio> #include<iostream> #include<algorithm> #i ...

  3. 模板】AC自动机(简单版)

    模板]AC自动机(简单版) https://www.luogu.org/problemnew/show/P3808 这是一道简单的AC自动机模板题. 用于检测正确性以及算法常数. 为了防止卡OJ,在保 ...

  4. 【模版】AC自动机(简单版)

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

  5. AC自动机(简单版)(施工ing)

    声明 想看加强版的戳这里(施工ing,作者正努力中)~ 先贴题目吧哎~   AC自动机加强版  洛谷 P3796 题目: 洛谷 P3808 (数据范围困了我好久 TAT) 反正涉及字符串的算法都很玄学 ...

  6. 洛谷P3808 【模板】AC自动机(简单版)

    题目背景 这是一道简单的AC自动机模板题. 用于检测正确性以及算法常数. 为了防止卡OJ,在保证正确的基础上只有两组数据,请不要恶意提交. 管理员提示:本题数据内有重复的单词,且重复单词应该计算多次, ...

  7. 【刷题】洛谷 P3808 【模板】AC自动机(简单版)

    题目背景 这是一道简单的AC自动机模板题. 用于检测正确性以及算法常数. 为了防止卡OJ,在保证正确的基础上只有两组数据,请不要恶意提交. 管理员提示:本题数据内有重复的单词,且重复单词应该计算多次, ...

  8. 洛谷 P3808 【模板】AC自动机(简单版)

    传送门:https://www.luogu.org/problem/P3808 题解:是一个AC自动机的裸题了,注释加在代码里面了 #include<bits/stdc++.h> usin ...

  9. 洛谷 P3808 【模板】AC自动机(简单版) 题解

    原题链接 前置知识: 字典树.(会 \(\texttt{KMP}\) 就更好) 显然呢,本题用 字典树 和 \(\texttt{KMP}\) 无法解决问题. 所以我们发明了一个东西: \(\textt ...

  10. [洛谷3808]【模板】AC自动机(简单版)

    题目大意: 给定$n$个模式串$p(\sum|p_i|\le10^6)$和一个$t(|t|\le10^6)$,求在$t$中被匹配的$p$的个数. 思路: AC自动机模板题,注意$t$中一个字符可能对应 ...

随机推荐

  1. shell 命令行参数(getopt和getopts)

    getopt 命令 使用getopt命令,可以解析任何命令行选项和参数,但是用法比较复杂.getopt的命令用法如下: $ getopt --help 用法: getopt optstring par ...

  2. rabbitmq在linux下单节点部署和基本使用

    RabbitMQ是基于erlang开发的消息服务,官网为:https://www.rabbitmq.com,RabbitMQ要依赖erlang运行,所以要先安装erlang环境,rabbitmq可以用 ...

  3. Kibana启动后外网访问不了

    问题 Kibana启动后,使用外网访问 http://ip地址:5601 访问不了日志中最后显示 "statusCode":302 ,在控制台 curl http://localh ...

  4. linux中高并发socket最大连接数的优化详解

    linux中高并发socket最大连接数的优化详解 https://m.jb51.net/article/106546.htm?from=singlemessage

  5. Python安装依赖包及开发工具转移到Visual Studio 2019

    #pip升级pip install --upgrade pip#安装pillow图形库pip install pillow #安装二维码库 pip install MyQR PyCharm工具导入依赖 ...

  6. pandas连接多个表格concat()函数

    网易云课堂该课程链接地址 https://study.163.com/course/courseMain.htm?share=2&shareId=400000000398149&cou ...

  7. spring boot整合H2数据库

    一.背景: .H2数据库是一个开源的关系型数据库.H2是一个嵌入式数据库引擎,采用java语言编写,不受 平台的限制,同时支持网络版和嵌入式版本,有比较好的兼容性,支持相当标准的sql标准,支持集群. ...

  8. Linux下挂载超过2T的磁盘

    1.使用命令进入交互模式并且查看当前硬盘分区信息 parted /dev/sdb p 2.删除当前存在分区,并在此查看结果 rm 1 p 3.将硬盘格式化为gpt mklabel gpt 4.对磁盘分 ...

  9. kotlin基础 常见容器的取值范围

  10. Scrapy中的Settings

    Settings Scrapy设置(settings)提供了定制Scrapy组件的方法.可以控制包括核心(core),插件(extension),pipeline及spider组件.比如 设置Json ...