洛谷P3808 AC自动机复杂版

洛谷 P3808 【模板】AC 自动机(简单版) AC 自动机模板 阅读详情

这题有个数据非常鬼畜,反正我的板子莫名会wa一个地方,改改虽然对了但是还是有点懵逼。

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<vector>
#include<cstring>
#include<queue>
#include<cstring>
#include<string>
#include<map>
using namespace std;
struct node{
    node*next1[26];
    node*fail;
    int tag,cnt;string strinfo;
    node(){
        memset(next1,0,sizeof(next1));fail=NULL;tag=0;cnt=0;
    }
}*root=new node();
void insert(string str)
{
    node*p=root;
    for(int i=0;i<str.size();i++){
        int x=str[i]-'a';
        if(!p->next1[x]){
            node*t=new node();p->next1[x]=t;
        }
        p=p->next1[x];
    }
    (p->tag)++;p->strinfo=str;
    //if(str=="ab")cout<<1<<endl;
}
void build_fail_pointer(void)
{
    node*p,*temp;
    queue<node*>que;que.push(root);
    while(!que.empty()){
        temp=que.front();que.pop();
        for(int i=0;i<26;i++){
            if(temp->next1[i]){
                if(temp==root)temp->next1[i]->fail=root;
                else{
                    p=temp->fail;
                    while(p){
                        if(p->next1[i]){
                            temp->next1[i]->fail=p->next1[i];break;
                        }
                        p=p->fail;
                    }
                    if(!p)temp->next1[i]->fail=root;
                }
                que.push(temp->next1[i]);
            }
        }
    }
}
void ac_automation(string str)
{
    node*p=root;
    for(int i=0;i<str.size();i++){
        int x=str[i]-'a';
        while(!p->next1[x]&&p!=root)p=p->fail;
        p=p->next1[x];
        if(!p)p=root;
        node*temp=p;
        while(temp!=root){
            if(temp->tag){
                //if(temp->strinfo=="ab")cout<<temp->cnt<<endl;
                //cout<<temp->strinfo<<endl;
                temp->cnt++;
            }
            //else break;这一句一定不能要!!!!!!!!!!!!!!!
            temp=temp->fail;
        }
    }
}
void dl(node*p)//清除所有节点
{
    for(int i=0;i<26;i++){
        if(p->next1[i])dl(p->next1[i]);
    }
    if(p!=root)delete p;
}
int maxn=0;vector<string>ans;
void find(node *p)
{
    for(int i=0;i<26;i++){
        if(p->next1[i]){
            find(p->next1[i]);
        }
    }
    if(p->cnt){
        //if(p->strinfo=="ab")cout<<p->cnt<<endl;
        if(p->cnt>maxn){//如果大于现有答案,清空以前的答案
            maxn=p->cnt;ans.clear();
            for(int i=1;i<=p->tag;i++)
                ans.push_back(p->strinfo);
        }
        else if(p->cnt==maxn)
            for(int i=1;i<=p->tag;i++)
                ans.push_back(p->strinfo);
    }
}
int main()
{
    int n,i,j;string str;
    while(cin>>n&&n){
        map<string,int>m;int shunxu=0;//map保存加入顺序
        maxn=0;ans.clear();dl(root);
        for(i=0;i<26;i++)root->next1[i]=NULL;root->fail=NULL;root->cnt=0;root->tag=0;
        for(i=1;i<=n;i++){
            cin>>str;insert(str);m.insert(pair<string,int>(str,++shunxu));
        }
        build_fail_pointer();
        cin>>str;
        //cout<<str<<endl;
        ac_automation(str);find(root);
        cout<<maxn<<endl;
        map<int,string>m1;
        for(auto i=ans.begin();i!=ans.end();i++){
            string strt=*i;
            auto j=m.find(strt);m1.insert(pair<int,string>(j->second,strt));//按照加入顺序再次丢进一个从小到大的map中,方便按顺序输出
            m.erase(j);
        }
        for(auto i=m1.begin();i!=m1.end();i++)
            cout<<i->second<<endl;
    }

    return 0;
}

鬼畜数据:

10
qabqks
vimbirqy
cflwvxtp
klljfj
ab
nkeiid
fkypjfev
yvgp
evdhs
xaizql
qabqksatffqpjomzstjabfklljfjqevdhsqabqkscflwvxtpeevdhsmzonkeiid

标准输出:

3
ab

如果加上71行那句不能要的就会疯狂wa,一脸懵逼….

HDU 自动 AC 机(Python) 一款 HDU OJ 的自动刷题工具,搜索来源可选用 百度搜索 / 必应搜索,支持并行以及串行查找,祝早日刷上航电首页哦~ 使用 Python 编写,执行之前你需要在同目录下创建文件 aclog.txt ,然后粘贴进你目前已经 AC 的题目,然后在代码执行过程中便不会去再查找这些题了。 立即下载

相关推荐

洛谷用户空间爬取器

洛谷用户空间爬取器,运行即开始爬取用户空间,注意要现在同目录下建立一个叫users_space的文件夹

AC自动机

注:本文章仅是个人的学习笔记,引用的多份文章均仅是为了整合笔记,方便查阅复习

Cyw172956431的博客 809

Matlab:imageDatastore() 高效读取图像数据集的实战技巧

本文详细介绍了Matlab中imageDatastore()函数的高效使用技巧,帮助用户从繁琐的手动读取图像数据集中解放出来。通过核心语法、关键参数(如IncludeSubfolders、LabelSource、ReadSize)的解析,以及数据集分割、打乱等进阶实战操作,指导读者构建稳定、高效的图像数据读取管道,特别适用于大型图像数据集处理和机器学习项目。

hill8的博客 1100

AC自动机详解

前置芝士 KMP字符串匹配算法 Trie树(字典树) 引入 来看一道题目:(洛谷 P3808 【模板】AC自动机(简单版)) 给定 nnn 个模式串 sis_isi​ 和一个文本串 ttt,求有多少个不同的模式串在文本串里出现过。 你想到了什么? KMP?KMP用来处理单模匹配问题有奇效,但是解决这道题么。。。 这就要用到一种神奇 难 的算法:AC自动机了!(充满诱惑力的名字) AC自动机 Aho-Corasick automaton,该算法在1975年产生于贝尔实验室,是著名的多模匹配算法。——百

Wu_while的博客 610

全国大学生软件测试大赛Web应用测试(二)Selenium功能测试环境配置

全国大学生软件测试大赛Web应用测试(二)Selenium功能测试环境配置指南配置JAVA配置mooctest配置ChromeDriver配置SeleniumSelenium的使用 环境配置指南 配置JAVA 首先进入JDK8官方安装地址 然后找到Windows 64位 jdk8 点击下载(这里下载需要登录Orcale 账户) 下载后JDK的安装根据提示进行,还有安装JDK的时候也会安装JRE,一并安装就可以了。 安装JDK,安装过程中可以自定义安装目录等信息,例如我们选择安装目录为 D:\java\jav

Kennen0_0的博客 9606

音乐频谱灯的硬件艺术:从STM32到SK9822LED的工程美学

本文探讨了基于STM32微控制器和SK9822 LED的音乐频谱灯硬件设计与实现。通过ADC采集音频信号,利用FFT算法进行频谱分析,并驱动LED阵列呈现动态视觉效果,展现了硬件工程与艺术美学的完美融合。

Pepper的专栏 215

AC自动机入门,洛谷P3808

用的到的目录首先了解triefail指针(kmp)代码了解更多其他讲解博客KMPtrie 首先了解 两个会出现在模板题面里的词语 文本串和模式串: 给你几个单词和一个字符串; 求在字符串中出现的单词的个数 这里文本串就是给的字符串,模式串就是单词。 AC自动机是一个多模匹配算法。 学习AC自动机要知道trie字典树和kmp算法。 知道trie和kmp的话AC自动机的算法基本上也就会了 我觉着学...

BIGBIGPPT的博客 368

《企业AI能力地图构建:AI应用架构师的关键秘籍》

构建企业AI能力地图是企业在AI时代实现战略转型和创新发展的关键举措,它需要从评估企业当前AI能力出发,全面了解技术储备、数据资产和人才队伍的现状。将企业业务战略转化为具体的AI应用场景,并进行优先级排序,是确保AI应用能够为企业带来实际价值的重要步骤。通过深入理解业务战略和挖掘应用场景,企业可以找准AI应用的切入点,提高投资回报率。

AI架构全栈开发实战笔记 631

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

题目传送门 终于看懂啦!终于学会了AC自动机啦!(Flag立起)写篇博客梳理一下自己的思路吧。 在文章的开头,必须先放上一些大佬的博客来压压场面:我选的当然是ZZK大佬,神犇传送门 然而AC自动机的原理其实是比较好理解的,就是把Trie树和KMP的思想结合起来。这么说起来KMP就是单个字符串的AC自动机啊。(雾) 给出许多模式串,把这些字符串都加入到Trie树中,在每个字符串结尾的叶子节点

Chester King 755

硬件工程师笔记——运算放大电路Multisim电路仿真实验汇总

本文系统介绍了运算放大电路的基础知识及其应用。主要内容包括:1)运算放大器的基本结构、理想特性及分析方法(虚短、虚断、叠加定理);2)比例运算电路(同向、反向、差分)的工作原理与仿真分析;3)求和运算、加减运算电路的实现方法;4)积分、微分、指数和对数运算电路的基本原理;5)过零电压比较器的功能特点。通过理论分析和仿真实验,详细阐述了各类运算放大电路的输入输出特性、相位关系和增益计算,为硬件工程师提供了实用的电路设计参考。

XU157303764的博客 2479

猫群优化算法(CSO)详解:从生物灵感到智能优化

猫群优化算法(CSO)是一种模拟猫科动物行为的群体智能优化算法。该算法基于猫的两种主要行为模式:搜寻状态(全局探索)和跟踪状态(局部开发)。CSO通过混合率(MR)动态调整两种模式的比例,实现探索与开发的平衡。算法核心包括搜寻模式的变异操作和跟踪模式的速度-位移模型,具有收敛性能好、全局搜索能力强等特点。相比传统优化算法,CSO在高维复杂问题中表现优异,已成功应用于函数优化、图像处理等多个领域。算法性能受混合率、变化域等参数影响,自适应参数策略可进一步提升优化效果。

qq_42212808的博客 617

AC自动机算法简介(洛谷P3808)

给出n个单词,再给出一段包含m个字符的文章,让你找出有多少个单词在文章里出现过。如果直接跑n遍KMP的话时间复杂度会较高(O(nm)),这时AC自动机算法便应运而生。

forezxl的博客 1073

零基础入门simulink建模仿真--基于Simulink的QPSK调制与解调仿真建模示例

QPSK是一种相位调制技术,将两个比特映射到一个符号上,每个符号对应四个可能的相位之一(0°、90°、180°、270°)。通过Simulink,我们可以通过模块化的建模方式实现QPSK的调制和解调过程,并观察信号在信道中的传输效果。通过本指南,我们介绍了如何基于Simulink搭建一个完整的QPSK调制与解调仿真模型,并进行仿真和性能评估。背景介绍:理解QPSK调制与解调的基本原理及其应用。所需工具和环境:列出进行QPSK仿真所需的工具和环境。步骤详解。

amy_mhd的博客 1308

AC自动机总结

如果你还不知道KMP是什么,或者不知道Trie是什么,先点下面的链接,学好这两样再来看这篇文章。 KMP入门教程传送门。 Trie入门教程传送门。 好,那么我来讲讲AC自动机吧。 以洛谷P3808模板题为例, 如果我们有n个模式串,和一个文本串,我们需要统计有多少个模式串在文本串中出现了,怎么办? 显然,如果我们直接枚举每个模式串,然后将其与文本串进行匹配,判断是否匹配成功,那么效率就

Holylight_Knight 1641

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

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

https://www.luogu.com.cn/problem/P3808题目背景: 这是一道简单的AC自动机模板题,用于检测正确性以及算法常数。题目描述: 给定nnn个模式串sis_isi​和一个文本串ttt,求有多少个不同的模式串在文本串里出现过。两个模式串不同当且仅当他们编号不同。输入格式: 第一行是一个整数,表示模式串的个数 nnn。 第 222 到第 (n+1)(n + 1)(n+1) 行,每行一个字符串,第 (i+1)(i + 1)(i+1) 行的字符串表示编号为 iii 的模式串 sis_i

数学、算法爱好者的博客 622

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

洛谷P3808 :AC自动机模板

2020.6.10 自己仔细研究了下好多的模板,最后整合成了一套比较适合自己码风的。之前也抄过模板,但是好像并不太能理解什么意思,于是没有记住。窝学东西往往就是需要先看一看,然后再放一放才能突然记住。 终于算写出来了,放进仓库,等会再去A困难版。我比较喜欢封装,但是如果把数组放struct里面就得memset初始化了,没法卡常数hhhh(用时翻倍),就套个壳子吧。 代码: #include <bits/stdc++.h> using namespace std; #define limit (5

Stagflation的博客 355

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Ac自动机练习

Ac自动机是用来解决 多个小串(模式串),在一个大串(文本串)中出现次数这种类似问题的 因为Trie树上直接跑dfs时间复杂度太大,所以考虑减少复杂度 fail指针,相当于每次存了个扫到的当前最长后缀 Trie树上用bfs建fail指针。暴力扫文本串即可 洛谷p3808,简单模板 给定n个模式串和1个文本串,求有多少个模式串在文本串里出现过。 /* ...

这里RevolIA,_(:з」∠)_ 248

再写ac自动机

/* 洛谷 p3808 */ #include<bits/stdc++.h> using namespace std; const int N=5e5+1000; struct tire { int c[N][26],val[N],fail[N],cnt; //字典树 void Insert(char *s){ int len=strlen(s);int now=0;...

Insistor 253

「刷题笔记」AC自动机

单调栈一.原理二.习题练习1.洛谷 P3808 AC自动机(简单版)2.洛谷 P3796 AC自动机(加强版)3.洛谷 P5357 AC自动机(二次加强版)4.5. 一.原理 二.习题练习 1.洛谷 P3808 AC自动机(简单版) 题目来源:https://www.luogu.com.cn/problem/P3808 题意: 解析: #include <iostream> #include <cstdio> #include <cstring> #include &lt

wqq的博客 371

ac自动机——学习

简介 ac自动机是一种有确定限状态自动机 大众的理解就是在字典树上跑kmp 前置知识点 kmp, 字典树 正题 我们知道kmp是模式串与文本串进行匹配的算法,即两个串之间匹配。那我们思考这样一个问题。如果模式串有多个,文本串有一个,如何算出每个模式串在文本串上的匹配。按原有思维,我们需要对每个模式串与文本串进行一次kmp,这样的话,时间复杂度就很高了。 于是乎,树上看毛片 横空出世 ac自动机首先...

three_trees的blog 195

通俗易懂のAC自动机小结

AC自动机小结AC自动机的思想 = trie树 + KMPAC自动机是用来干什么的呢 多模式串匹配一个文本串建成一个AC自动机需要三步1. 构建trie树    2. 构建fail指针   3. 模式串匹配首先用模式串建成一颗trie树 在每个模式串末尾打上标记 表示这是一个模式串的末尾树上的每一个节点都对应一个fail指针 作用和KMP中的nex差不多 如果我可以通过fail指针走向一个节点 那...

未来可期。 1025

AC自动机(板子总结)

板子来源 https://www.cnblogs.com/hefenghhhh/p/5051334.html https://www.cnblogs.com/Simon-X/p/5687318.html 心得 去年九月份学过的知识, 就不再详细展开了, 大概就是树上的KMP 以前总用指针的,不好写,100多行, 今天也搞一个数组的板子 然后每个trie都是一个节点,节点与next...

小衣同学的博客 788

学习AC自动机

记录自己学习从零到了解AC自动机

HZHaholic的博客 192

字符串系列(五)——多模式串匹配强有力的工具AC自动机

之前太年轻,觉得学了SAM、Hash就不再需要AC自动机了。但Hash的弊病就是要挨位尝试,其时间复杂度O(nm)无法承受。而SAM的弊病就是其占用的空间过大(多乘了2),并且速度也很慢!!!!!(复杂度同Hash)一般AC自动机题目串长都会给到1e6,SAM很轻易就会挂掉。而我们今天的主角AC自动机,复杂度仅仅是所有串的长度和。而对于字典树,也完全没有必要开太大的空间。这里给出一个字典树全字符缩...

呆头呆脑没有烦恼 420
上一篇: (模板)AC自动机
下一篇: 洛谷P2444 病毒(AC自动机变形)
HumveeA6
博客等级 码龄17年 12粉丝 175原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值