专题·AC自动机

news2024/11/27 18:46:22

初见安——!!这里是咕咕咕好久好久的樱狸QvQ

考完初赛了 有一点点的空闲时间 来整理一下博客【因为发现忘性很大……超过一个月没用的东西就记不住了QAQ

前置知识:KMP,tire树。

一、AC自动机

其实AC自动机就是在tire树上KMP。

举个例子:给你一个串S,一个串T,求T在S中出现的次数。显然KMP线性匹配。

那么如果给你一个串S,很多串T,问你每个串在S中的出现次数呢?复杂度就不保了。这时就要用到AC自动机。

比如给的是abc,aab,abcba,acb,S串是abccbacbabcba。

我们对给的串建tire树:【图丑求放过

然后在这颗树上跟着走串S。

比如我们给这个图的点编号后,

s串abccbacbabcba会依次走过:1,4,5,然后发现下一个没有c了跳不动。

根据KMP的思想,我们在trie树上令fail指针表示与KMP类似的含义,也就是失配指针。fail[i]表示trie树上从根到当前点形成的字符串的后缀匹配前缀的最长串的结尾位置。那么上图的树中我们就可以建立fail指针:

没有连边的都是指向根节点】

这样一来,当S失配后,就会沿着fail往回跳,缩小匹配的字符串。而S走的全过程中的子串都不重复,因为每走一步必然会相较于前一步多了第i个字符。所以每次形成的字符串的后缀都是答案之一

接着上文的例子,S失配没法跳c后回到根节点0,然后继续跳b,失配;跳a,跳到1,8,9;然后回到0……

我们在trie树上记录每个点为末尾代表了哪些字符串,然后就可以统计答案了。

看一个例题吧:洛谷 【模板】AC自动机(简单版)

看看代码吧——

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<queue>
#include<map>
#define maxn 1000006
using namespace std;
typedef long long ll;
int read() {
	int x = 0, f = 1, ch = getchar();
	while(!isdigit(ch)) {if(ch == '-') f = -1; ch = getchar();}
	while(isdigit(ch)) x = (x << 1) + (x << 3) + ch - '0', ch = getchar();
	return x * f;
}

int n, t[maxn][26], fail[maxn], num[maxn], tot = 0;
char s[maxn];
void add() {//建立trie树
	register int len = strlen(s), p = 0;
	for(int i = 0; i < len; i++) {
		int u = s[i] - 'a';
		if(!t[p][u]) t[p][u] = ++tot; p = t[p][u];
	}
	num[p]++;//表示以p结尾的字符串数
}

queue<int> q;
void build() {
	for(int i = 0; i < 26; i++) if(t[0][i]) q.push(t[0][i]);//bfs建立fail指针
	while(q.size()) {
		register int u = q.front(); q.pop();
		for(int i = 0, v; i < 26; i++) {
			v = t[u][i];
			if(v) fail[v] = t[fail[u]][i], q.push(v);//如果有儿子,就匹配过去
			else t[u][i] = t[fail[u]][i];//没有的话相当于路径压缩,直接连过去
		}
	}
}

int ans = 0;
void AC() {
	register int len = strlen(s), p = 0;
	for(int i = 0, u, v; i < len; i++) {
		u = s[i] - 'a';  p = t[p][u], v = p;
		while(v && num[v] != -1) {//暴力跳fail查询
			ans += num[v], num[v] = -1;
			v = fail[v];
		}
	}
}

signed main() {
	n = read();
	for(int i = 1; i <= n; i++) scanf("%s", s), add();
	build(); scanf("%s", s); AC();
	printf("%d\n" , ans);
	return 0;
}

(未完待续 咕太久了我也忘了后续要写啥QAQ

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

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

相关文章

点击化学PEG试剂DBCO-PEG4-NHS,1427004-19-0知识特点总结

一、描述&#xff1a; DBCO-PEG4-NHS酯是一种含有NHS酯的点击化学PEG试剂&#xff0c;能够在中性或稍碱性条件下与伯胺&#xff08;例如赖氨酸残基的侧链或氨基硅烷涂层表面&#xff09;特异有效地反应&#xff0c;形成共价键。亲水性PEG间隔臂提高了水溶性&#xff0c;并提供了…

ConcurrentHashMap

我们说ConcurrentHashMap是用在多并发环境下的HashMap JDK1.7 segment数组HashEntry数组链表&#xff08;即两个数组挂一个链表&#xff09; 上锁的时候锁的是segment数组&#xff0c;采用分段锁&#xff0c;每一把锁只锁一个Segment&#xff0c;默认是这个数组大小为16&…

【D3.js】1.13-动态设置每个 Bar 的坐标

title: 【D3.js】1.13-动态设置每个 Bar 的坐标 date: 2022-12-01 16:33 tags: [JavaScript,CSS,HTML,D3.js,SVG] 虽然创建了多个rect&#xff0c;但是都重叠在一起&#xff0c;如何将他们分列开来呢&#xff1f; 一、学习目标 使用回调函数动态设置坐标 .attr(“x”,(d,i)>…

laravel vue tailwind

下载laravel最新7.x composer create-project --prefer-dist laravel/laravle blog 7.x-dev cd blog valet link blog valet links blog.test 测试通过后&#xff0c;开始安装tailwind npm i npm i tailwindcss autoprefixer postcss7 都是最新版应该也没有什么问题 在根目录下…

UE的Blend Profile

参考&#xff1a;Animation Blend Profile in Unity 参考&#xff1a;Unreal Engine - How to make a Blend Profile 参考&#xff1a;blend-masks-and-blend-profiles-in-unreal-engine 什么是Blend Profile Animation Blend Profile is a UE4 animation system feature that …

aws eks 使用keycloak集成eks oidc访问apiserver

资料 OpenID Connect Tokens Kubernetes 与 OpenID 集成 SSO 登录测试 Introducing OIDC identity provider authentication for Amazon EKS Understanding Amazon Cognito user pool OAuth 2.0 grants 在 Kubernetes 中使用 Keycloak OIDC Provider 对用户进行身份验证 深…

Koa2基础笔记

目录 一、快速入门 二、中间件 链式调用 洋葱圈模型 异步处理 三、路由 koa-router 四、请求参数解析 处理URL参数 处理body参数 五、错误处理 原生的错误处理 使用中间件 一、快速入门 新建文件夹使用VSCode打开&#xff0c;终端运行npm init -y生成package.json…

[附源码]计算机毕业设计springboot水果管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

冬季寒冷,普通空调如何做到智能控制,增温又降耗的?

寒冷的冬日总少不得取暖的工具&#xff0c;空调成为人们的优先选择。但是&#xff0c;在办公大楼、商场等需要长时间空调供暖&#xff0c;空调又多的地方&#xff0c;空调控制让不少人感觉到了困扰。上下班时间空调多&#xff0c;检查慢&#xff0c;如果漏掉其中一个&#xff0…

C++——类和对象讲解

C——类和对象讲解总览 本篇文章的讲解将按照上述的方式&#xff0c;逐层递进&#xff0c;进一步帮你拿捏C类和对象这部分。 类和对象上&#xff08;基础篇&#xff09; 1、初识面向对象编程&#xff1a; 初步了解面向过程和面向对象的区别 举个比较感人的例子用来帮助铁子…

Qt视频监控系统一个诡异问题的解决思路(做梦都想不到)

一、前言 由于Qt版本众多&#xff0c;几百个版本之间存在不兼容的情况&#xff0c;为此如果要兼容很多版本&#xff0c;没有取巧的办法和特殊的捷径&#xff0c;必须自己亲自安装各个版本编译运行并测试&#xff0c;大问题一般不会有&#xff0c;除非缺少模块&#xff0c;小问…

健壮性测试是什么?

当大多数人开车时&#xff0c;他们不会担心刹车失灵。当他们的孩子得到一个新玩具时&#xff0c;他们也不担心因故障受伤。事实上&#xff0c;大多数人在日常生活中根本不担心系统故障。 这是因为软件开发人员或质量控制工程师已经解决了质量问题。如果目标是交付高质量、可靠…

基础:html5、html、htm、xhtml、dhtml、shtml、shtm、xml、xsl、xslt

一、理解 1.1、HTML5&#xff08; HyperText Markup Language 5 &#xff09; HTML5_百度百科 HTML5 技术结合了 HTML4.01 的相关标准并革新&#xff0c;符合现代网络发展要求&#xff0c;在 2008 年正式发布。HTML5 由不同的技术构成&#xff0c;其在互联网中得到了非常广泛…

TCP/IP五层协议栈(2)

1.传输层协议(TCP传输的机制补充) 1.1.滑动窗口 滑动窗口存在的意义就是在保证可靠性的前提下,尽量提高传输效率. 由于TCP是得保证可靠传输的,所以每一次数据发送时都需要等待对方的ACK.大部分时间都用在等ACK上,而确认应答是可靠传输的主要机制又不能不等.所以有了新的机制…

JavaScript -- 多种类型转换方法总结

文章目录类型转换1 转换为字符串2 转换为数值3 转换为布尔值4 总结类型转换 类型转换指将一种数据类型转换为其他类型 类型转换是根据当前值去创建另一个值&#xff0c;而不是将当前值直接进行转换 这里说到的转换都是显示类型转换&#xff0c;除此之外还有隐式类型转换 1 转…

MnTTS: 开源蒙古语语音合成数据集及其基线模型

本次分享内蒙古大学蒙古文信息处理重点实验室、蒙古文智能信息处理技术国家地方联合工程研究中心及语音理解与生成实验室 (S2LAB) &#xff08;https://ttslr.github.io/index_S2Group.html&#xff09;共同发布的开源蒙古语语音合成数据集及其基线模型。相关论文《MnTTS: An O…

BI业务用户商业分析新时代,如何把数据用透?

数字化转型进入实质性阶段&#xff0c;企业对于数据的需求也随之加深。然而&#xff0c;一些企业积累了大量数据&#xff0c;却难以深度释放数据价值。 近几年&#xff0c;作为数据应用的有力工具&#xff0c;BI商业智能分析平台同样进入了转折期&#xff0c;其发展趋势明显呈…

Nacos后台系统未授权添加管理员

一&#xff1a;什么是nacos Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集&#xff0c;帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。 Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。 Nacos 是构建以“服务”为中…

爱奇艺:基于龙蜥与 Koordinator 在离线混部的实践解析 | 龙蜥技术

在 2022 云栖大会龙蜥峰会云原生专场上&#xff0c;来自爱奇艺的基础架构研究员赵慰分享了《基于龙蜥与 Koordinator 的在离线混部实践》技术演讲&#xff0c;以下为本次演讲内容&#xff1a; 一、爱奇艺离线业务混部背景 与众多互联网公司一样&#xff0c;爱奇艺常见的负载…

Go语言学习笔记-A Tour of Go 练习笔记-Images

Exercise: Images 练习题目: Remember the picture generator you wrote earlier? Lets write another one, but this time it will return an implementation of image.Image instead of a slice of data. Define your own Image type, implement the necessary methods, …