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

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. MongoDB 实现 create table tab2 as select

    1. var result = db.foo.aggregate(...);db.bar.insert(result.result); 2. var temp1 = db.mtb1.find(name ...

  2. 51: Luogu 2485 模板

    $des$ 1.给定y.z.p,计算y^z mod p 的值: 2.给定y.z.p,计算满足xy ≡z(mod p)的最小非负整数x: 3.给定y.z.p,计算满足y^x ≡z(mod p)的最小非负 ...

  3. P1501 [国家集训队]Tree II LCT

    链接 luogu 思路 简单题 代码 #include <bits/stdc++.h> #define ls c[x][0] #define rs c[x][1] using namesp ...

  4. Nagios HTTP WARNING: HTTP/1.1 403 Forbidden

    当我们第一次搭建好nagios后会有Nagios HTTP WARNING: HTTP/1.1 403 Forbidden告警 要解决这个问题, 可以创建一个html文件,然后重启两个服务,等待几分钟 ...

  5. web程序设计关于我们

    项目名称 福大咸鱼市场 开发团队 项目板块 负责人 美工 黄鸿杰 后端 胡继文 前端 葛家灿 联系方式:1175204449@qq.com

  6. Refused to execute script from '...' because its MIME type ('') is not executable, and strict MIME type checking is enabled.

    写在前面 部署项目到weblogic上启动首页访问空白, 浏览器控制台报如题错误. web.xml中把响应头添加防止攻击的报文过滤器禁用就行了(仅仅是为了启动), 以下为转载内容, 可以根据需要自行测 ...

  7. C#实体类null自动转空字符串

    C#实体类null自动转空字符串 using System.ComponentModel.DataAnnotations; [DisplayFormat(ConvertEmptyStringToNul ...

  8. .Net Core 3.0 Api json web token 中间件签权验证和 Cors 中间件处理跨域请求

    第一步:在Nuget上安装"Microsoft.AspNet.WebApi.Cors"包,并对api controller使用[EnableCors]特性以及Microsoft.A ...

  9. java多线程(五)线程通讯

    1.1. 为什么要线程通信 多个线程并发执行时,在默认情况下CPU是随机切换线程的,有时我们希望CPU按我们的规律执行线程,此时就需要线程之间协调通信. 1.2. 线程通讯方式 线程间通信常用方式如下 ...

  10. python之terminaltables

    from terminaltables import AsciiTable, DoubleTable, SingleTable from colorclass import Color, Window ...