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.hqwc.cn/news/214141.html

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

相关文章

pgz easyexcel如何给excel文件添加自定义属性

免费API方式 直接上传URL,自定义修改Excel 视频演示【内含接口地址】 https://www.ixigua.com/7304510132812153385 前情提示 | 功能说明 多选仅支持微软office、office365系列Excel。因为WPS宏功能需要企业版且付费生成xlsx、xlsm等文件,office和WPS均可以打开,均可以单…

设计模式——行为型模式(一)

行为型模式用于描述程序在运行时复杂的流程控制,即描述多个类或对象之间怎样相互协作共同完成单个对象都无法单独完成的任务,它涉及算法与对象间职责的分配。 行为型模式分为类行为模式和对象行为模式,前者采用继承机制来在类间分派行为,后者采用组合或聚合在对象间分配行…

Adobe的组织工具程序Bridge 2024 版本下载与安装

目录 前言一、Bridge 2024安装二、使用配置总结 前言 Adobe Bridge是由 Adobe 公司开发的一款用于管理和组织创意资产的工具。它是Adobe Creative Cloud 套件的一部分&#xff0c;为设计师、摄影师和其他创意专业人员提供了一个集中管理和浏览其多媒体文件的平台。注&#xff…

Unity UGUI图片锯齿严重怎么解决

在开发的时候&#xff0c;发现图片锯齿严重&#xff0c;打包到移动端或者在编辑器都这样&#xff0c;如下图 原因&#xff1a; 查了一些资料&#xff0c;找到了原因如下&#xff1a;关于为什么会发生这种情况&#xff1a;看起来你的源资源比你在屏幕上显示的大小大得多。所以当…

基于Vue+SpringBoot的个人健康管理系统

项目编号&#xff1a; S 040 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S040&#xff0c;文末获取源码。} 项目编号&#xff1a;S040&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 健康档案模块2.2 体检档案模块2.3 健…

软件设计不是CRUD(6):低耦合模块设计实战——组织机构模块(上)

组织机构功能是应用系统中常见的业务功能之一&#xff0c;但是不同性质、不同行业背景、不同使用场景的应用系统对组织机构功能的要求可能完全不一样。所以使用这样的功能对低耦合模块设计进行示例性的讲解是比较具有代表性的。在后续的几篇文章中&#xff0c;我们会首先进行示…

系列四、编程式事务

一、概述 编程式事务是指程序员手动的在业务代码中控制事务执行的流程&#xff0c;业务方法正常执行提交事务&#xff0c;业务方法执行过程中出现异常则回滚事务。 二、编程式事务环境搭建 2.1、项目概览 2.2、pom.xml <dependencies><!--spring基本依赖--><d…

csrf漏洞修复

漏洞说明&#xff1a;通过篡改请求头中的Referer值依旧能够访问到接口。 通过http请求头里面的Referer随意访问接口 通过下面两个代码类程序来实现你的程序不会被攻击&#xff0c;里面有两个实体&#xff0c;如果你感觉这个程序对你有用&#xff0c;联系我&#xff0c;我私发…

PyQt基础_004_ 按钮类控件QPushButton以及自定义按钮控件

Qpushbutton基本操作 1.热键 2.按钮加图标 3.按钮事件等 import sys from PyQt5.QtCore import * from PyQt5.QtGui import * from PyQt5.QtWidgets import *class Form(QDialog):def __init__(self, parentNone):super(Form, self).__init__(parent)layout QVBoxLayout()se…

云安全之盾:ZStack 云主机安全防护解决方案全方位保护云环境

随着云计算的蓬勃发展&#xff0c;网络威胁愈发复杂&#xff0c;涵盖了从勒索病毒到APT攻击的各种威胁类型。在这一风云变幻的网络安全环境下&#xff0c;云主机安全不再仅仅是一个选项&#xff0c;它是信息系统安全的核心要素。云轴科技ZStack 云主机安全防护解决方案是为了满…

局域网协议:动态主机配置协议(Dynamic Host Configuration Protocol,DHCP)

在局域网络中&#xff0c;DHCP协议通过自动化和简化网络配置过程&#xff0c;提高网络的可管理性和灵活性&#xff0c;使得设备可以更轻松地连接到网络并获得所需的网络配置信息。 文章目录 What is DHCP?DHCP的组成1. DHCP客户端2. DHCP服务器&#xff1a;3. 中继代理&#…

OpenAI研发神秘“Q*”模型:科学家认输,AI赢了人类关键一战

图片来源&#xff1a;视觉中国 作者丨叶蓁 编辑丨康晓 出品丨深网腾讯新闻小满工作室 在山姆奥特曼&#xff08;Sam Altman&#xff09;被OpenAI前董事会突然罢免之前&#xff0c;数位研究人员向董事会发送了一封信&#xff0c;警告称他们发现了一种能够威胁到人类的强大人工…