AC自动机(简单模板)

AC自动机,就相当于是在字典树上用kmp。next数组回退的位置为最大匹配字符串在字典树上的节点位置。

在获取字典树上的next数组的时候用的是BFS每次相当与处理的一层。

下图中红线为,可以回退的位置,没有红线的节点回退的位置都是虚拟原点。

int n, m;
int o[N];
int tr[N][26], cnt[N], idx;
char str[N];
int q[N], ne[N];inline void insert() { // 正常的字典树插入板子int p = 0;for(int i = 0; str[i]; i ++) {int t = str[i] - 'a';if(!tr[p][t]) tr[p][t] = ++ idx;p = tr[p][t];}cnt[p] ++; // 记录当前字符串出现的次数
}void build() {int  hh = 0, tt = -1;for(int i = 0; i < 26; i ++) // 因为第二层的所有字符串长度为一,next值肯定为1,直接入队即可if(tr[0][i])q[++ tt] = tr[0][i];while(hh <= tt) {int t = q[hh ++];for(int i = 0; i < 26; i ++) {int p = tr[t][i];if(!p) tr[t][i] = tr[ne[t]][i]; // 匹配失败,则回退,路径压缩过,一次回退即可else {ne[p] = tr[ne[t]][i]; // 记录ne数组,顺便压缩路径q[ ++ tt] = p;}}}
}inline void sovle() {idx = 0;cin >> n;for(int i = 0; i < n; i ++) {cin >> str;insert(); // 将所有字符串全都插入字典树}build(); // 获取next数组cin >> str;int res = 0;int s = 0;for(int i = 0, j = 0; str[i]; i ++) { // 同时匹配字典树中所有的字符串int t = str[i] - 'a';j = tr[j][t];int p = j;while(p && cnt[p] != 0) { // 线性匹配,这里的第二个条件是一个优化,只有在每个字符串只记录一次的前提下使用res += cnt[p]; // 记录出现过的字符串的个数cnt[p] = 0; // 因为每个字符串只计算一次,所以要清空p = ne[p]; // 回退}}cout << res << endl;
}

与上一题不一样的只有一小部分,这题中,每个字符串可重复记录,所以就不能加上那个线性优化,还需要记录每个字符串出现的次数即可。

int n, m;
int o[N];
int tr[N][26], cnt[N], idx;
string sr[200];
char str[N];
int q[N], ne[N], st[N];inline void insert(string s) {int p = 0;for(int i = 0; i < s.size(); i ++) {int t = s[i] - 'a';if(!tr[p][t]) tr[p][t] = ++ idx;p = tr[p][t];}cnt[p] ++;
}void build() {int  hh = 0, tt = -1;for(int i = 0; i < 26; i ++)if(tr[0][i])q[++ tt] = tr[0][i];while(hh <= tt) {int t = q[hh ++];for(int i = 0; i < 26; i ++) {int p = tr[t][i];if(!p) tr[t][i] = tr[ne[t]][i];else {ne[p] = tr[ne[t]][i];q[ ++ tt] = p;}}}
}int query(string s) { // 与插入差不多 些许操作不同int p = 0;for(int i = 0; i < s.size(); i ++) {int t = s[i] - 'a';if(!tr[p][t]) return 0;p = tr[p][t];}return st[p];
}inline void sovle() {while(cin >> n, n) {memset(tr, 0, sizeof tr);memset(cnt, 0, sizeof cnt);memset(ne, 0, sizeof ne);memset(st, 0, sizeof st);idx = 0;for(int i = 0; i < n; i ++) {cin >> sr[i];insert(sr[i]);}build();cin >> str;int res = 0;int s = 0;for(int i = 0, j = 0; str[i]; i ++) {int t = str[i] - 'a';j = tr[j][t];int p = j;while(p) {st[p] += cnt[p]; // 记录该字符串出现的次数s = max(st[p], s); // 因为要求出来最多出现的字符串的次数p = ne[p]; // 回退}}cout << s << endl;for(int i = 0; i < n; i ++) {int k = query(sr[i]); // 字典树的查询操作,查询st数组。if(s == k) cout << sr[i] << endl; // 是最大的直接输出。}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/166534.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于C#实现线段树

一、线段树 线段树又称"区间树”&#xff0c;在每个节点上保存一个区间&#xff0c;当然区间的划分采用折半的思想&#xff0c;叶子节点只保存一个值&#xff0c;也叫单元节点&#xff0c;所以最终的构造就是一个平衡的二叉树&#xff0c;拥有 CURD 的 O(lgN)的时间。 从…

关于同一接口有多个不同实现的设计方案

关于同一接口有多个不同实现的设计方案 前言 最近公司做了一个银行相关的项目&#xff0c;告诉我公司对接了多个银行的支付&#xff0c;每个银行都有对应的接口要去对接&#xff0c;比如&#xff1a;交易申请&#xff0c;交易取消&#xff0c;支付&#xff0c;回单&#xff0…

rabbitMQ发布确认-交换机不存在或者无法抵达队列的缓存处理

rabbitMQ在发送消息时&#xff0c;会出现交换机不存在&#xff08;交换机名字写错等消息&#xff09;&#xff0c;这种情况如何会退给生产者重新处理&#xff1f;【交换机层】 生产者发送消息时&#xff0c;消息未送达到指定的队列&#xff0c;如何消息回退&#xff1f; 核心&…

麒麟KYSEC使用方法05-命令设置密码强度

原文链接&#xff1a;麒麟KYSEC使用方法05-命令设置密码强度 hello&#xff0c;大家好啊&#xff0c;今天给大家带来麒麟KYLINOS的kysec使用方法系列文章第五篇内容----使用命令设置密码强度&#xff0c;密码强度策略有两个文件需要修改&#xff0c;pwquality.conf/login.defs&…

命令执行总结

之前做了一大堆的题目 都没有进行总结 现在来总结一下命令执行 我遇到的内容 这里我打算按照过滤进行总结 依据我做过的题目 过滤system 下面是一些常见的命令执行内容 system() passthru() exec() shell_exec() popen() proc_open() pcntl_exec() 反引号 同shell_exec() …

大语言模型概述(三):基于亚马逊云科技的研究分析与实践

上期介绍了基于亚马逊云科技的大语言模型相关研究方向&#xff0c;以及大语言模型的训练和构建优化。本期将介绍大语言模型训练在亚马逊云科技上的最佳实践。 大语言模型训练在亚马逊云科技上的最佳实践 本章节内容&#xff0c;将重点关注大语言模型在亚马逊云科技上的最佳训…

解决Chrome浏览器无法启动,因为应用程序的并行配置不正确

目录 现象 方法1 方法2 附带&#xff1a;书签路径 一次比较奇怪的问题&#xff0c;花了一些时间&#xff0c;记录下来。 现象 进到本机默认安装路径&#xff1a; C:\Users\你的用户名\AppData\Local\Google\Chrome\Application 下面会有个版本号的目录&#xff0c;如我的…

快手ConnectionError

因为运行的程序被中断导致 top然后查看站用处内存高的accelerate kill进程号 9回车

linux基础5:linux进程1(冯诺依曼体系结构+os管理+进程状态1)

冯诺依曼体系结构os管理 一.冯诺依曼体系结构&#xff1a;1.简单介绍&#xff08;准备一&#xff09;2.场景&#xff1a;1.程序的运行&#xff1a;2.登录qq发送消息&#xff1a; 3.为什么需要内存&#xff1a;1.简单的引入&#xff1a;2.计算机存储体系&#xff1a;3.内存的意义…

微服务知识小结

1. SOA、分布式、微服务之间有什么关系和区别&#xff1f; 1.分布式架构指将单体架构中的各个部分拆分&#xff0c;然后部署到不同的机器或进程中去&#xff0c;SOA和微服务基本上都是分布式架构的 2. SOA是一种面向服务的架构&#xff0c;系统的所有服务都注册在总线上&#…

让工作效率提升10倍:十大AIGC工具评测【建议收藏】

AI技术的普及已经在近年来不断增长。这种技术已经改变了我们与电脑的互动方式&#xff0c;让我们能够更高效、更自然地完成任务。本文将展示10个基于ChatGPT、GPT-3.5和 GPT-4.0 AI模型构建的最强大的资源&#xff0c;使您更容易充分利用它们的潜力。因此&#xff0c;如果您想利…

详解深度学习中的图神经网络GNN

引言 图神经网络GNN是深度学习的一个分支。 深度学习的四个分支对应了四种常见的数据格式&#xff0c;前馈神经网络FNN处理表格数据&#xff0c;表格数据可以是特征向量&#xff0c;卷积神经网络CNN处理图像数据&#xff0c;循环神经网络RNN处理时序数据&#xff0c;图神经网…

c++|类和对象(上)

目录 一、面向过程和面向对象初步认识 二、类的引入和定义 2.1类的引入 2.2类的定义 三、类的访问限定符及封装 3.1访问限定符 3.2封装 四、类的作用域 五、类的实例化 六、类的对象大小的计算 6.1如何计算对象的大小 6.2类对象的存储方式 七、类成员函数的thi…

Python-Django的“日志功能-日志模块(logging模块)-日志输出”的功能详解

01-综述 可以使用Python内置的logging模块来实现Django项目的日志记录。 所以与其说这篇文章在讲Django的“日志功能-日志模块-日志输出”&#xff0c;不如说是在讲Pthon的“日志功能-日志模块-日志输出”&#xff0c;即Python的logging模块。 下面用一个实例来进行讲解。 …

2023年亚太杯数学建模A题水果采摘机器人的图像识别功能(免费思路)

中国是世界上最大的苹果生产国&#xff0c;年产量约为 3500 万吨。同时&#xff0c;中国也是世界上最大的苹果出口国&#xff0c;世界上每两个苹果中就有一个出口到国。世界上每两个苹果中就有一个来自中国&#xff0c;中国出口的苹果占全球出口量的六分之一以上。来自中国。中…

基于51单片机超声波测距汽车避障系统

**单片机设计介绍&#xff0c; 基于51单片机超声波测距汽车避障系统 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于51单片机的超声波测距汽车避障系统是一种用于帮助汽车避免碰撞和发生事故的设备&#xff0c;以下是一个基本…

Visual Studio 2022安装教程(千字图文详解),手把手带你安装运行VS2022以及背景图设置

VS2022最新最全安装教程 很高兴你打开了这篇博客&#xff0c;接下来我们一起安装并且使用VS2022吧 文章目录 VS2022最新最全安装教程一.官网下载二.安装启动三.项目测试1.创建新项目2.选择我们使用的模板&#xff08;C空项目&#xff09;&#xff0c;继续冲&#xff01;3.进入…

docker的使用方法

文章目录 为什么要用dockerdocker安装docker工作原理docker命令docker搭建练习docker可视化docker镜像docker容器数据卷DockerFiledocker全流程Docker网络原理docker composedocker swarm 为什么要用docker 官网&#xff1a;https://www.docker.com文档地址&#xff1a;https:…

系列五、声明式事务(xml方式)

一、概述 声明式事务(declarative transaction management)是Spring提供的对程序事务管理的一种方式&#xff0c;Spring的声明式事务顾名思义就是采用声明的方式来处理事务。这里所说的声明&#xff0c;是指在配置文件中声明&#xff0c;用在Spring配置文件中声明式的处理事务来…