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

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. 验证码破解 | Selenium模拟登录知乎

      import requests import re import execjs import time import hmac from hashlib import sha1 class Zhi ...

  2. ent 基本使用六 Mixin

    ent 的Mixin 可以让我们服用已有的schema Mixin 接口说明 type Mixin interface { Fields() []ent.Field } 一个demo 代码 // -- ...

  3. 少女NULL中

    NULL inline void read (int &now) { register ; ; !isdigit (word); word = getchar ()) ; + word - ' ...

  4. 内置函数— — eval、exec、compile

    字符串类型代码:eval.exec.compile eval()  执⾏字符串类型的代码,并返回最终结果 print(eval("2+2")) # 4 n=8 def func() ...

  5. SpringMVC实现文件下载的两种方式及多文件下载

    1.传统方法 @RequestMapping("/download") public String download( String fileName ,String filePa ...

  6. 关于python的四舍五入

    参考https://blog.csdn.net/qq_39234705/article/details/82817703 四舍五入有很多相关资料,主要用两种方法round()和'%.2f' 两种方法取 ...

  7. git 相关流程和报错解决

    git 相关流程: 预先配置: gitroot $ git config user.name XXXgitroot $ git config user.email XXX@XXX.com git re ...

  8. 我的Mac上有哪些软件

    工具 Pycharm CE GoLand Chrome 微信 网易云音乐 有道云笔记 iTerm Postman Sublime Text bashrc配置(支持显示git branch以及详细路径信 ...

  9. Java地址:

    GitHub:https://github.com/nanchen2251 个人博客:https://nanchen2251.github.io/ 简书地址:http://www.jianshu.co ...

  10. github加速

    访问 https://www.ipaddress.com/ 找到以下网址对应的ip,在本地hosts里面映射,或者到路由器内映射好即可. github.com assets-cdn.github.co ...