2021CCPC华为云挑战赛:HDU 7091 重叠的子串(SAM + 线段树合并)

重叠的子串

给定一个长度为n(1≤∣s∣≤105)n(1 \le \mid s \mid \le 10 ^ 5)n(1s105)的只由小写字母构成的字符串sss,有m,(1≤m≤106)m, (1 \le m \le 10 ^ 6)m,(1m106)个询问:

每次询问给定l,rl, rl,r,问sss是否存在一个字串ttt,满足∣t∣<2(r−l+1)\mid t \mid < 2(r - l + 1)t<2(rl+1),且s[l,r]s[l, r]s[l,r]ttt中出现最少两次。

s[l,r]s[l, r]s[l,r]ttt上匹配,假设匹配的结束位置为p1,p2,…p_1, p_2, \dotsp1,p2,,如果ttt是一个合法串,则一定存在两个不同的数i,ji, ji,j

且满足pi≠pjANDabs(pi−pj)<r−l+1p_i \ne p_j \ AND\ abs(p_i - p_j) < r - l + 1pi=pj AND abs(pipj)<rl+1,从这一点出发,我们考虑后缀自动机。

首先我们构建SAMSAMSAM,建出parentparentparent树,我们不难找到endpos=rendpos = rendpos=r的节点,考虑从这个点向上跳,

当我们跳到最上面的满足len≥r−l+1len \ge r - l + 1lenrl+1的节点时,显然这个点所代表的endposendposendpos集合中的字串,一定都含有s[l,r]s[l, r]s[l,r]这个后缀。

简单的理解一下也就是s[l,r]s[l, r]s[l,r]可以在这些节点匹配上,所以我们只要判断这些节点是否存在两个endposendposendpos满足其差值≤r−l+1\le r - l + 1rl+1即可。

这里我用的是线段树合并,对线段树上的节点记录其区间最左边有值的树,区间最有边有值的树,

以及当前区间的答案,然后合并上去即可,我们只要记录下每个endposendposendpos集合里面的最小的答案即可,整体复杂度T×O(nlog⁡n+m)T \times O(n \log n + m)T×O(nlogn+m)

#include <bits/stdc++.h>using namespace std;const int N = 1e5 + 10;int num, last, endpos[N << 1];int head[N << 1], nex[N << 1], to[N << 1], cnt;int fa[N << 1][21], ans[N << 1], idx[N], n, m;int root[N << 1], ls[N << 6], rs[N << 6], tot;char str[N];struct Res {int l, r, minn;
}a[N << 6];struct statu {int len, link, next[26];
}s[N << 1];void push_up(int rt) {if (ls[rt] && rs[rt]) {a[rt] = {a[ls[rt]].l, a[rs[rt]].r, min({a[ls[rt]].minn, a[rs[rt]].minn, a[rs[rt]].l - a[ls[rt]].r})};}else if (ls[rt]) {a[rt] = a[ls[rt]];}else {a[rt] = a[rs[rt]];}
}void update(int &rt, int l, int r, int x) {if (!rt) {rt = ++tot;}if (l == r) {a[rt] = {x, x, 0x3f3f3f3f};return ;}int mid = l + r >> 1;if (x <= mid) {update(ls[rt], l, mid, x);}else {update(rs[rt], mid + 1, r, x);}push_up(rt);
}int merge(int x, int y, int l, int r) {if (!x || !y) {return x | y;}if (l == r) {return x;}int mid = l + r >> 1;ls[x] = merge(ls[x], ls[y], l, mid);rs[x] = merge(rs[x], rs[y], mid + 1, r);push_up(x);return x;
}void add(int x, int y) {to[cnt] = y;nex[cnt] = head[x];head[x] = cnt++;
}void Init() {for (int i = 0; i < num; i++) {s[i].len = s[i].link = endpos[i] = head[i] = root[i] = 0;for (int j = 0; j < 26; j++) {s[i].next[j] = 0;}}num = last = 0;for (int i = 1; i <= tot; i++) {ls[i] = rs[i] = 0;}tot = 0;
}void init() {s[0].len = 0, s[0].link = -1;num++, last = 0, cnt = 1;
}void extend(int c, int id) {int cur = num++;s[cur].len = s[last].len + 1, endpos[cur] = id, idx[id] = cur;int p = last;while (p != -1 && !s[p].next[c]) {s[p].next[c] = cur;p = s[p].link;}if (p == -1) {s[cur].link = 0;}else {int q = s[p].next[c];if (s[p].len + 1 == s[q].len) {s[cur].link = q;}else {int clone = num++;s[clone] = s[q];s[clone].len = s[p].len + 1;while (p != -1 && s[p].next[c] == q) {s[p].next[c] = clone;p = s[p].link;}s[q].link = s[cur].link = clone;}}last = cur;
}void dfs(int rt, int f) {fa[rt][0] = f;for (int i = 1; i <= 20; i++) {fa[rt][i] = fa[fa[rt][i - 1]][i - 1];}for (int i = head[rt]; i; i = nex[i]) {if (to[i] == f) {continue;}dfs(to[i], rt);root[rt] = merge(root[rt], root[to[i]], 1, n);}if (endpos[rt]) {update(root[rt], 1, n, endpos[rt]);}ans[rt] = a[root[rt]].minn;
}void build() {for (int i = 1; i < num; i++) {add(s[i].link, i);}dfs(0, -1);
}int get(int rt, int len) {for (int i = 20; i >= 0; i--) {if (fa[rt][i] != 0 && fa[rt][i] != -1 && s[fa[rt][i]].len >= len) {rt = fa[rt][i];}}return rt;
}int main() {// freopen("in.txt", "r", stdin);// freopen("out.txt", "w", stdout);int T;scanf("%d", &T);while (T--) {scanf("%d %d %s", &n, &m, str + 1);init();for (int i = 1; i <= n; i++) {extend(str[i] - 'a', i);}build();for (int i = 1, l, r; i <= m; i++) {scanf("%d %d", &l, &r);int rt = get(idx[r], r - l + 1);if (ans[rt] < r - l + 1) {puts("Yes");}else {puts("No");}}Init();}return 0;
}

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

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

相关文章

ASP.NET Core 3.0 使用gRPC

一.简介gRPC 是一个由Google开源的&#xff0c;跨语言的&#xff0c;高性能的远程过程调用&#xff08;RPC&#xff09;框架。gRPC使客户端和服务端应用程序可以透明地进行通信&#xff0c;并简化了连接系统的构建。它使用HTTP/2作为通信协议&#xff0c;使用 Protocol Buffers…

mysql 1030 error:Got error 28 from storage engine

最近生产应用连不上生产环境数据库&#xff0c;使用命令行连上去之后&#xff0c;执行命令出现1030 error。 故Google之&#xff0c;解决方案如下。 mysql 1030 error 是因为没有足够的空间&#xff0c;清理磁盘空间即可恢复正常使用。 然后追踪发现&#xff0c;磁盘空间为99G&…

Codeforces Round #739 (Div. 3)(AK实况)

Codeforces Round #739 (Div. 3) A. Dislike of Threes 找到第kkk个既不是333的倍数&#xff0c;个位数上也不是333的数&#xff0c;也已预处理然后O(1)O(1)O(1)输出&#xff0c;也可直接forforfor循环暴力。 #include <bits/stdc.h>using namespace std;int main() {/…

利用Helm简化Kubernetes应用部署(2)

目录定义Charts 使用Helm部署Demo Helm常用操作命令 定义Charts回到之前的“charts”目录&#xff0c;我们依次进行解读并进行简单的修改。Chart.yaml配置示例&#xff1a;apiVersion: v1 appVersion: "1.1" description: A demo Helm chart for Kubernetes name:…

linux查看磁盘空间命令

Linux 查看磁盘空间可以使用 df 和 du 命令。 df df 以磁盘分区为单位查看文件系统&#xff0c;可以获取硬盘被占用了多少空间&#xff0c;目前还剩下多少空间等信息。 例如&#xff0c;我们使用df -h命令来查看磁盘信息&#xff0c; -h 选项为根据大小适当显示&#xff1a; …

Visual Studio 2019 16.3 正式发布,支持 .NET Core 3.0

微软正式发布了 Visual Studio 2019 16.3 版本&#xff0c;主要更新内容如下&#xff1a;.NET Core 3.0Visual Studio 版本 16.3 包括对 .NET Core 3.0 的支持。注意&#xff1a;如果使用的是 .NET Core 3.0&#xff0c;则需要使用 Visual Studio 16.3 或更高版本。.NET Core 桌…

Linux清空文件内容的三种方法

Linux清空文件内容的三种方法 测试文件&#xff1a;test.txt 1、 $ > test.txt 2、 $echo “” > test.txt 3、 $cat /dev/null > test.txt

Problem M. Mediocre String Problem(Z 函数 + PAM)

Problem M. Mediocre String Problem 给定两个串s,ts, ts,t&#xff0c;要求有多少不同的三元组(i,j,k)(i, j, k)(i,j,k)&#xff0c;满足&#xff1a; 1≤i≤j≤∣s∣1 \le i \le j \le \mid s \mid1≤i≤j≤∣s∣。1≤k≤∣t∣1 \le k \le \mid t \mid1≤k≤∣t∣。j−i1≥k…

【干货】规模化敏捷DevOps四大实践之持续探索CE(中英对照版)

本文翻译来自SAFe DevOps社群帅哥网友贾磊&#xff1a;高级质量经理&敏捷教练 曾就职于外企、国企、大型上市企业等&#xff0c;担任过测试工程师、测试经理、项目经理、敏捷教练、质量总监、高级质量经理等岗位。是一名敏捷变革的爱好者和践行者。爱好网球、羽毛球。正文原…

Spring Cloud——Eureka——架构体系

1、概述 Eureka包括两个端&#xff1a; Eureka Server&#xff1a;注册中心服务端&#xff0c;用于维护和管理注册服务列表。Eureka Client&#xff1a;注册中心客户端&#xff0c;向注册中心注册服务的应用都可以叫做Eureka Client&#xff08;包括Eureka Server本身&#x…

C - Maximize GCD(简单数论)

C - Maximize GCD 给定长度为n,(2≤3105)n, (2 \le 3 \times 10 ^ 5)n,(2≤3105)的数组a,(1≤ai≤3105)a, (1 \le a_i \le 3 \times 10 ^ 5)a,(1≤ai​≤3105)&#xff0c;一个数字K,(1≤K≤1018)K, (1 \le K \le 10 ^{18})K,(1≤K≤1018)&#xff0c; 我们可以对数组aaa进行…

推荐.neter常用优秀开源项目系列之二

.net社区有很多优秀的开源项目&#xff0c;我们今天再推荐12个开源项目&#xff1b;1. Domain-Driven-Design-ExampleDDD 示例 挺不错的。github https://github.com/zkavtaskin/Domain-Driven-Design-Example2.SmartStoreNET开源的电商项目github https://github.com/smartsto…

Zookeeper: Zookeeper架构及FastLeaderElection机制

本文转发自技术世界&#xff0c;原文链接 http://www.jasongj.com/zookeeper/fastleaderelection/ 一、Zookeeper是什么 Zookeeper是一个分布式协调服务&#xff0c;可用于服务发现&#xff0c;分布式锁&#xff0c;分布式领导选举&#xff0c;配置管理等。 这一切的基础&am…

I. Rise of Shadows(类欧几里得)

I. Rise of Shadows 一天有HHH个小时&#xff0c;MMM分钟&#xff0c;问&#xff0c;有多少个整数分钟&#xff0c;满足时针与分针的角度≤α\le \alpha≤α&#xff0c;α2πAHM\alpha \frac{2 \pi A}{HM}αHM2πA​。 ∑i0H−1∑j0M−1[∣2π(iMj)HM−2πjM∣≤2πAHM]∑i0…

与时俱进 | 博客现已运行在 .NET Core 3.0 及 Azure 上

点击上方蓝字关注“汪宇杰博客”导语9月23日&#xff0c;微软正式发布了 .NET Core 3.0&#xff0c;这个版本具有大量新功能和改进。我也在第一时间将自己的博客网站更新到了 .NET Core 3.0&#xff0c;并且仍然跑在微软智慧云 Azure 国际版的应用服务上。本文总结了我在博客迁…

Zookeeper:基于Zookeeper的分布式锁与领导选举

本文转发自技术世界&#xff0c;原文链接 http://www.jasongj.com/zookeeper/distributedlock/ 1、Zookeeper特点 1.1 Zookeeper节点类型 如上文《Zookeeper架构及FastLeaderElection机制》所述&#xff0c;Zookeeper 提供了一个类似于 Linux 文件系统的树形结构。该树形结构…

Asp.Net Core Mvc Razor之RazorPage

在AspNetCore.Mvc.Razor命名空间中的RazorPage继承RazorPageBase&#xff0c;并定义的属性为&#xff1a;HttpContext Context 表示当前请求执行的HttpContextRazorPageBase定义为抽象类&#xff0c;并继承了接口&#xff1a;IRazorPageIRazorPage接口定义属性如下&#xff1a;…

#138. 类欧几里得算法

#138. 类欧几里得算法 以下除法均为向下取整&#xff0c; 定义f(a,b,c,n,k1,k2)∑x0nxk1(axbc)k2f(a, b, c, n, k_1, k_2) \sum\limits_{x 0} ^{n} x ^{k_1} \left(\frac{a \times x b}{c}\right) ^ {k_2}f(a,b,c,n,k1​,k2​)x0∑n​xk1​(caxb​)k2​。 ∑x0nxk1(axbc)k2…

Spring Cloud——Consul——架构体系

我们知道&#xff0c;Eureka 2.X因遇到问题&#xff0c;已停止研发。Spring Cloud官方建议迁移到Consul或者Zookeeper等其他服务发现中间件。 下面是 Spring Cloud 支持的服务发现软件以及特性对比&#xff1a; 一、Consul 介绍 Consul 是 HashiCorp 公司推出的开源工具&…

ASP.NET Core 3.0 gRPC 双向流

目录ASP.NET Core 3.0 使用gRPCASP.NET Core 3.0 gRPC 双向流ASP.NET Core 3.0 gRPC 认证授权一.前言在前一文 《二. 什么是 gRPC 流gRPC 有四种服务类型&#xff0c;分别是&#xff1a;简单 RPC&#xff08;Unary RPC&#xff09;、服务端流式 RPC &#xff08;Server streami…