牛客竞赛字符串专题 NC237662 葫芦的考验之定位子串(SAM + 后缀链接树上倍增)

news2024/11/16 18:02:33

在这里插入图片描述
在这里插入图片描述

题意:

给出一个字符串S,|S| ≤ 250000,给出 Q < 250000 次询问,每次需要回答 S[l, r] 在 S 中共出现了多少次。

思路:

如果使用 SAM,我们提前求出每个状态的 cnt[u],询问就是要求我们快速定位 S[l, r] 所在的状态。

我们知道 S[l, r] 一定是 S 的前缀 S[1, r] 的后缀,而 S 的前缀共有 n 个:我们容易找到 S 的每个前缀对应的 SAM 状态节点,不妨设 S[1, i] 对应于状态 ed[i]。

由于 S[l, r] 是 S[l, r] 的后缀,他对应的状态一定位于 ed[i] 的后缀链接上,也即我们要从 ed[i] 到根 root 这条树链上最浅(也就是离根最近,子串结束位置最多,囊括了 S[l, r] 所有结束位置,等价于出现次数)的满足 len[u] >= r - l + 1 的状态。

显然暴力是会超时的,使用树上倍增即可,这里我们使用 dfs 预处理树上倍增要用的 pa 数组。

代码:

ask 函数中 if 里的判断我一开始还联系了节点代表子串长度的最小值 mnl,我写的是:
if(mxl >= leng && mnl <= leng),

这样是不行的,举个例子,比如下面的情况:

在这里插入图片描述
如果像我那样写,图中的第一个链就跳不了了,答案就会出错。

这就属于对倍增的理解不够透彻了,倍增的含义是:从大到小能跳就跳。

因此只需要考虑节点代表子串长度的最大值 mxl 和目标子串长度 leng 即可。

#include<bits/stdc++.h>

using namespace std;

const int N = 2.5e5 + 10, M = N << 1, mx = 20;
int ch[M][26], fa[M], len[M], ed[M], np = 1, tot = 1;
long long cnt[M];
int pa[M][mx];
vector<int> g[M];
char s[N];
int q;

void extend(int c)
{
	int p = np; np = ++tot;
	len[np] = len[p] + 1, cnt[np] = 1, ed[len[np] - 1] = np;
	while (p && !ch[p][c]) {
		ch[p][c] = np;
		p = fa[p];
	}
	if (!p) {
		fa[np] = 1;
	}
	else {
		int q = ch[p][c];
		if (len[q] == len[p] + 1) {
			fa[np] = q;
		}
		else {
			int nq = ++tot;
			len[nq] = len[p] + 1;
			fa[nq] = fa[q], fa[q] = fa[np] = nq;
			while (p && ch[p][c] == q) {
				ch[p][c] = nq;
				p = fa[p];
			}
			memcpy(ch[nq], ch[q], sizeof ch[q]);
		}
	}
}

void dfs(int u, int f)
{
	pa[u][0] = f;
	for (int i = 1; i <= mx - 1; ++i) {
		pa[u][i] = pa[pa[u][i - 1]][i - 1];
	}
	for (auto son : g[u]) {
		dfs(son, u);
		cnt[u] += cnt[son]; //预处理pa数组的同时对后缀链接树进行dp
	}
}

long long ask(int l, int r)
{
	int leng = r - l + 1;
	int p = ed[r];
	for (int i = mx - 1; i >= 0; --i) {
		int ff = pa[p][i];
		int mxl = len[ff];
		if (mxl >= leng) {//当即将倍增跳的父节点代表子串长度最大值大于等于目标串的长度,则跳
			p = ff;
		}
	}
	return cnt[p];
}

signed main()
{
	scanf("%s%d", s, &q);
	for (int i = 0; s[i]; ++i) {
		extend(s[i] - 'a');
	}
	for (int i = 2; i <= tot; ++i) {
		g[fa[i]].emplace_back(i);
	}
	dfs(1, 0);
	while (q--)
	{
		int l, r; scanf("%d%d", &l, &r);
		--l, --r;
		printf("%lld\n", ask(l, r));
	}

	return 0;
}

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

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

相关文章

GPT-5暂时来不了 OpenAI悄然布局移动端

OpenAI彻底用GPT-4带火自然语言大模型后&#xff0c;互联网科技行业的大头、小头都在推出自家的大模型或产品。一时间&#xff0c;生成式AI竞速赛上演&#xff0c;“吃瓜群众”也等着看谁能跑赢OpenAI。 坊间预测&#xff0c;干掉GPT-4的还得是GPT-5。结果&#xff0c;OpenAI的…

总结827

学习目标&#xff1a; 4月&#xff08;复习完高数18讲内容&#xff0c;背诵21篇短文&#xff0c;熟词僻义300词基础词&#xff09; 学习内容&#xff1a; 高等数学&#xff1a;刷1800&#xff0c;做了26道计算题&#xff0c;记录两道错题&#xff0c;搞懂了&#xff0c;但并不…

node.js 安装及配置环境变量只看此文

文章目录 1. node.js 安装2. Node.js环境变量配置3. 国内镜像网站配置 1. node.js 安装 node.js 安装完成后会带相应的npm 包管理工具。 node js 官网下载 选择合适的版本进行下载。 这里选择稳定版本。一步一步执行安装&#xff0c;期间安装盘默认C 盘&#xff0c;建议更换到…

10个Java开发人员最常犯的错误

这个列表总结了10个Java开发人员最常犯的错误&#xff0c;是我基于大量的github上的开源项目&#xff0c;Stack overflow上的问题&#xff0c;还有一些流行的google搜索的分析&#xff0c;没有明显示的评估证明它们是前10&#xff0c;但它们绝对是很常见的。 1.Array转ArrayLi…

计算机网络-IP地址计算专题(非常重要)

文章目录 IP地址快速计算法则IP计算例题1(给出了子网掩码)IP计算例题2(给出了建网比特数)求划分子网的个数求划分N个子网之后的子网掩码子网的划分超网聚合变形&#xff0c;求子网地址的规律假如让你设计网络 IP地址快速计算法则 软考中的地址计算题都只需要计算出某个IP地址所…

港联证券|万亿级AIGC赛道或迎有序监管

近段时间&#xff0c;连续有国内外科技巨子涌入万亿级AIGC&#xff08;生成式AI&#xff09;赛道&#xff0c;A股商场上AIGC、ChatGPT等人工智能相关概念也是继续火热。但与此同时&#xff0c;安全隐患也如冰山一角逐渐露出。多国政府正在考虑加强对其监管&#xff0c;AIGC在全…

时刻警惕!企业如何全面应对攻击战术演进

Fortinet FortiGuard Labs &#xff08;Fortinet全球威胁研究与响应实验室&#xff09;发布的 《全球威胁态势研究报告-2022年下半年》显示&#xff0c;不法分子正将更多资源投入至MITRE ATT&CK “前期侦察”和“武器构建”两大战术阶段&#xff0c;组织必须时刻提高警惕&a…

“QT 快速上手指南“ 之 计算器(三)信号与槽,connect 函数,QString

文章目录 前言一、什么是信号与槽&#xff1f;二、QObject::connect 函数三、QT 中的字符串类 QString1. 创建和初始化字符串&#xff1a;2. 字符串的拼接和添加3. 字符串的查找和替换4. 字符串的分割和处理 总结 前言 QT 中 信号 与 槽机制&#xff08;Signal and Slot&#…

Project1:Boolean Logic

目录 Part1:Lecture && bookunit 1.1 Boolean Logicunit 1.2 boolean function synthesisunit 1.3 logic gatesunit 1.4 Hardware Description languageunit 1.5 Hardware simulationunit 1.6 Multi-bit Buses part2:Project Part1:Lecture && book unit 1.1 …

Invalid bound statement (not found):报错解决方法

报错信息&#xff1a; Invalid bound statement (not found): com.atguigu.auth.mapper.SysMenuMapper.findMenuListByUserId 因为&#xff1a;maven加载机制 maven默认情况下&#xff0c;只会加载编译ser-main-java目录里面java类型文件&#xff0c;其他类型文件不会进行加…

如何利用在线帮助中心解决客户问题?

随着互联网的不断发展&#xff0c;越来越多的企业意识到客户服务的重要性。然而&#xff0c;如何提供高效、可靠、贴心的客户服务一直是企业面临的难题。在这个背景下&#xff0c;在线帮助中心应运而生。本文将介绍如何利用在线帮助中心解决客户问题&#xff0c;让企业更好地提…

中交二公局的数字化转型之路:微信扫一扫即可轻松巡检

中交二公局主要从事路桥施工等业务&#xff0c;具有公路工程施工总承包特级资质&#xff0c;是一家集铁路、隧道、机场、水工、市政、工程施工设计、咨询、监理等为一体的大型国有施工企业。 自成立以来&#xff0c;中交二公局在工程施工领域积累了丰富的经验&#xff0c;业务…

【java】maven引用外部 jar 包,以RXTXcomm.jar为例

目录 1.作为资源文件夹内的资源引用2.将jar包手动安装到maven仓库 工具&#xff1a;IntelliJ IDEA 2020.2.3 x64 1.作为资源文件夹内的资源引用 1.在项目根路径新建文件夹lib, 将资源文件复制到该文件夹。 2.将文件夹设置为资源文件夹&#xff1a;选中文件夹lib右键 -> Mak…

vscode + python + jupyter notebook环境配置

参考网络上的大神文章&#xff0c;在公司PC上搭建Pythonvscode环境&#xff0c;做一下记录。 安装环境参考如下文章&#xff1a; https://blog.csdn.net/qq_52271115/article/details/126773282 安装完毕Python后&#xff0c;我公司的电脑需要额外将下面两个环境变量添加到 …

出苗率相关论文

文章目录 2021A UAV Open Dataset of Rice Paddies for Deep Learning PracticeAutomatic UAV-based counting of seedlings in sugar-beet field and extension to maize and strawberry(Computers and Electronics in Agriculture) 2022Detection and Counting of Maize Leav…

6D目标检测简述

6D目标检测简述 文章目录 6D目标检测简述介绍基于模版匹配的算法基于点的算法基于描述子的算法基于特征的算法 基于深度学习的6D姿态估计基于RGB图像的深度学习方法**SSD-6D****Deep-IM****PV-Net****HybridPose****Self6D****DSC-PoseNet****GDR-Net****SO-Pose****KDF-Net** …

一文搞定接口幂等性架构设计方案

幂等性介绍 现如今很多系统都会基于分布式或微服务思想完成对系统的架构设计。那么在这一个系统中&#xff0c;就会存在若干个微服务&#xff0c;而且服务间也会产生相互通信调用。那么既然产生了服务调用&#xff0c;就必然会存在服务调用延迟或失败的问题。当出现这种问题&am…

VIP + Nginx + Keepalived

VIP&#xff08;Virtual IP Address&#xff09;&#xff0c;虚拟IP地址&#xff0c;主要是用来进行不同主机之间的切换&#xff0c;主要用在服务器的主从切换技术。主从服务器都配置同一个VIP地址&#xff0c;保障系统不间断切换。 Keepalived是高可用解决方案&#xff0c;借助…

Zookeeper源码分析——ZK服务端加载数据源码解析

ZK服务端加载数据源码解析 &#xff08;1&#xff09;zk 中的数据模型&#xff0c;是一棵树&#xff0c;DataTree&#xff0c;每个节点&#xff0c;叫做DataNode &#xff08;2&#xff09;zk 集群中的DataTree 时刻保持状态同步 &#xff08;3&#xff09;Zookeeper 集群中每个…

现代化生态灌区智慧灌溉管理系统-中小灌区节水改造

系统概述 现代化生态灌区智慧灌溉管理系统主要对对灌区的水情、雨情、土壤墒情、气象等信息进行监测&#xff0c;对重点区域进行视频监控&#xff0c;同时对泵站、闸门进行远程控制&#xff0c;实现了信息的测量、统计、分析、控制、调度等功能。为灌区管理部门科学决策提供了依…