(模板)AC自动机

【补题】AC自动机的三道模板题 AC自动机三道模板题 虽然是模板题,但是写出来的全是WA自动机 P3808 【模板】AC 自动机(简单版) P3808 【模板】AC 自动机(简单版) 这道题是AC自动机的模板题,只需要老老实实建立fail指针,建fail时顺带建边优化fail即可。 题目要求,求文本串中出现了几个模式串,只需要记录end,然后跳fail就行(为什么要跳fail可以画个图,顺便再把fail独立出来)。 只要在用的时候不要忘了调用建fail就行。 下面是一个模板。 struct ACAM { int child[MAXN 阅读详情

说明链接:https://blog.youkuaiyun.com/creatorx/article/details/71100840
代码:(其中有个地方需要非常注意)

// luogu-judger-enable-o2
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<queue>
#include<algorithm>
#include<cstring>
#include<string>
using namespace std;
struct node{
    node*next1[26];
    node*fail;
    int sum;
    node(){
        memset(next1,0,sizeof(next1));fail=NULL;sum=0;
    }
}*root=new node();
int cnt=0;
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->sum++;
}
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->sum){
                cnt+=temp->sum;temp->sum=0;
            }
            else break;//**如果不只是需要知道模式串是否出现过而**
            //**是要找出所有出现的位置的话,这一行是不能要的!!!!!!**
            //并且,根据观察,没有这一行似乎并不会导致答案错误,只是时间会增加;
            //但是,有这一行却可能导致答案错误
            temp=temp->fail;
        }
    }
}
int main()
{
    int n,i,j;string str;
    cin>>n;
    for(i=1;i<=n;i++){
        cin>>str;insert(str);
    }
    cin>>str;
    build_fail_pointer();ac_automation(str);
    cout<<cnt<<endl;

    return 0;
}
AC自动机(模板不带指针) 之前学AC自动机的时候学长给的模板是带指针的,然而我并没有学过指针。上网搜到的代码也大部分都是带指针的,少数的几个还有不对的【难过】,后来综合好几个板子写出了自己的模板,一方面自己记下来防止以后忘了,另一方面也造福广大不会指针的OIER们。 Defination Aho-Corasick automation,该算法在1975年产生于贝尔实验室,是著名的多模匹配算法。——百度百科 所以,A... 阅读详情

相关推荐

AT32F435/437开发实战:把SD卡变成U盘的完整指南(含源码解析)

本文提供了基于AT32F435/437微控制器将SD卡改造为U盘的完整实战指南。通过深入解析USB MSC协议与SDIO驱动的协同工作原理,详细介绍了硬件设计要点、软件架构融合、核心源码解析以及从编译到文件传输的完整调试流程,帮助开发者实现可靠的大容量存储设备扩展。

weixin_29159127的博客 409

AC自动机-详解AC自动机以及模板

AC自动机-详解AC自动机以及模板AC自动机算法简介AC自动机算法大致流程AC自动机详细图解AC自动机模板题与模板题目内容代码详解完整代码 AC自动机算法简介 首先简要介绍一下AC自动机,英文名:Aho-Corasick automation,该算法在1975年产生于贝尔实验室,是著名的多模板匹配算法之一。一个常见的例子就是给出n个单词,再给出一段包含m个字符的文章,让你找出有多少个单词在文章里出现过。 要搞懂AC自动机,先要有字典树Trie和KMP模式匹配算法的基础知识。其中,KMP是用于一对一的字符串匹

qq_43381135的博客 6856

扣子(coze)案例^第22期:零代码打造小红书竞品监控系统+AI自动生成运营策略建议

本文详细介绍了如何利用扣子(coze)平台零代码搭建小红书竞品监控系统。该系统通过自动化工作流抓取竞品笔记数据,并存入飞书多维表格,结合AI能力自动生成包含可视化分析报告在内的运营策略建议,帮助运营者高效进行数据驱动的市场分析。

weixin_29313239的博客 1004

AC自动机模板

模板 //AC自动机模板无last优化 struct AC_automation{ int trie[maxn][26]; int valori[maxn], val[maxn], fail[maxn], depth[maxn]; int cnt, M = 26; AC_automation(){ init(); } voi...

FIVE 280

IO多路转接 ——— select、poll、epoll

select是系统提供的一个多路转接接口。select函数的函数原型如下: 参数说明:参数timeout的取值:返回值说明:select调用失败时,错误码可能被设置为:fd_set结构与sigset_t结构类似,fd_set本质也是一个位图,用位图中对应的位来表示要监视的文件描述符。 调用select函数之前就需要用fd_set结构定义出对应的文件描述符集,然后将需要监视的文件描述符添加到文件描述符集当中,这个添加的过程本质就是在进行位操作,但是这个位操作不需要用户自己进行,系统提供了一组专门的接口,用

2021dragon的博客 7974

【WorkBuddy专栏40】从「帮你干活」到「帮你创造」——WorkBuddy设计创意功能深度拆解

【WorkBuddy专栏40】从「帮你干活」到「帮你创造」——WorkBuddy设计创意功能深度拆解

AI人人懂 1294

【AC自动机】AC自动机模板

AC自动机模板

JSure的代码库 1372

springboot&mybatis中数组和字符串数据类型的转换

/前端数组字段//数据库中字段/*与前端交互时使用的get/set*/System.out.println("接收前端数据");/*与前端交互时使用的get/set*//*与数据库交互时使用的get/set*/System.out.println("从数据库中读取数据");/*与数据库交互时使用的get/set*/

l_q_l的专栏 2475

AC_automaton,AC自动机模板

/* AC自动机,对多个模式串匹配,查找给出的文本串有多少个出现在模式串中 最简单的模板,需要修改 */ const int N = maxn*8; //N表示n*m,n为模式串的个数,m为模式串的长度 struct AC_automaton { int tr[N][26], tot; int e[N], fail[N]; void init(){ memset(tr, 0, sizeof(tr)); memset(e, 0, si

Cichard 251

HFSS实战项目——基片集成波导(SIW)带通滤波器

设计了一款直接耦合的SIW带通滤波器, 采用直接耦合的形式, 工作频率覆盖19~21 GHz, 通带内插入损耗小于1.5 dB, 回波损耗小于-20 dB, 带外抑制特性良好.

2401_87464239的博客 4896

ABAP CDS 实体权限控制,从 DCL 到 PFCG 的完整运行逻辑

本文探讨了SAP S/4HANA开发中CDS View的权限控制机制。核心观点如下: CDS access control通过DCL语言实现数据实例级权限控制,而非替代传统PFCG权限体系,二者形成互补关系:PFCG控制功能入口权限,DCL控制数据可见性。 DDL定义数据结构,DCL定义访问规则。DCL通过角色映射将数据字段与PFCG授权对象关联,运行时自动将权限条件注入SQL查询,实现数据过滤。 访问控制行为特点: 无DCL role不会默认拒绝访问 权限检查通过减少结果集而非抛出错误实现 需配合@Acc

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 101

【模板】AC自动机

luogu_P3808 【模板】AC自动机(简单版) Code #include<bits/stdc++.h> #define ll long long using namespace std; inline int read() { int x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch...

weixin_34138255的博客 76

记录一次Spring Framework 漏洞修复的过程

摘要:针对Spring Boot 2.6.13项目在阿里云漏洞扫描中发现的Spring Framework目录遍历漏洞(CVE-2024-38819),首先分析了漏洞成因,确认5.3.23版本存在风险。解决方案包括升级Spring Boot至2.7.18(对应Spring Framework 5.3.41)或6.0+版本,但后者需JDK17支持。临时方案通过配置HttpFirewall限制特殊字符,最终借助阿里云防护服务暂时解决问题。建议长期解决方案仍需升级至安全版本(Spring Boot 6.1.14或

极客栈 1486

我的AC自动机模板

AC自动机模板AC自动机模板AC自动机模板 #include<bits/stdc++.h> using namespace std; const int maxn = 5e5+7; const int max_size = 26; struct AC_Automachine{ struct My_Trie{ int next[max_size]; ...

qq_43710979的博客 185

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

[Trie/AC自动机/AC自动机进阶] AC自动机模板

T1 于是他错误的点名开始了 #include<bits/stdc++.h> using namespace std; #define in Read() inline int in{ int i=0,f=1;char ch; while(!isdigit(ch)&&ch!='-')ch=getchar(); if(ch=='-')ch=getchar(),f=-1; while(isdigit(ch))i=(i<<1)+(i<<3)+ch-48,

Antimonysbguy的博客 154

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

AC自动机模板题

AC自动机学习博客   AC自动机理解要点:     1)fail指针指向的是每个节点,在字典树上和这个节点后缀相同的最长单词,每次都这样匹配,必定不会漏过答案。     2)字典树建立后,会在bfs求fail阶段把字典树变成一个字典树图(不知道理解的对不对),就是把字典树的末尾节点再往下添加一层,并且连接到fail指针指向的相同位子的儿子。    两道模板题和AC代...

weixin_30632883的博客 152

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

[AC自动机 模板]

洛谷的两道模板题目 简单版 #include&amp;amp;lt;bits/stdc++.h&amp;amp;gt; #define N 500010 using namespace std; queue&amp;amp;lt;int&amp;amp;gt;q; struct AC_{ // 字典树相关,分别表示: 存储图,标记单词尾,总节点个数 int c[N][26], val[N], cnt; int fail[N]; // 失配转移 vo...

lzs_lazy 496

hdu 2222 裸的AC自动机静态模板

hdu 2222 裸的AC自动机静态数组模板

wintowanti 1208

AC自动机——【模板】AC自动机

摘要 题目要求实现AC自动机算法,统计多个模式串在文本串中的出现次数。AC自动机结合了字典树和KMP算法的思想,通过构建字典树和失配指针(fail指针)来高效匹配。算法步骤包括:1) 将所有模式串插入字典树;2) 使用BFS构建fail指针;3) 遍历文本串进行匹配;4) 通过拓扑排序聚合结果。时间复杂度为O(n+m),其中n是模式串总长度,m是文本串长度,适用于大规模字符串匹配。

swk13306006908的博客 569
上一篇: (模板)Trie树(字典树)
下一篇: 洛谷P3808 AC自动机复杂版
HumveeA6
博客等级 码龄17年 12粉丝 175原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值