【题解】JZOJ 7867 字符串

题意

给定串 s s s n n n 次操作,每次依次写下 [ l , r ] [l,r] [l,r] 的奇数下标字符,再写 [ l , r ] [l,r] [l,r] 的偶数下标字符,最后将写下的串插入到 r r r 位字符后。问最后串的前 k k k 位。

正解

考虑倒着做,操作离线。发现对于一次操作就是删除一个对应的串。考虑删除后的串的字符在原串中的位置。直接拿一个线段树维护,初始全是 1 1 1,删除段区间赋值为 0 0 0,这样就可以查找第 k k k 大,删除后的第 k k k 个字符就是前缀和第 k k k 大。

将最终相同的位置用并查集串起来。

最后找到 s s s 的每个字符在最终的串中的位置。然后并查集查找会连到这些点上。

最终每个点都能找到对应的字符,因为并查集合并是由删掉的连向没删的,所以最后的根一定是没有被删掉的,即原串。

时间复杂度 O ( n α ( k ) log ⁡ k ) O(n\space\alpha(k)\log k) O(n α(k)logk)

实现

#include <bits/stdc++.h>
using namespace std;
const int N = 3000005;
int n, K, l[5005], r[5005], tr[N << 3], lz[N << 3], fa[N];
char s[N];
int col[N];
#define ls rt << 1
#define rs rt << 1 | 1
void pushdown(int rt) { if (lz[rt]) tr[ls] = tr[rs] = 0, lz[ls] = lz[rs] = 1, lz[rt] = 0; }
void bdtr(int rt, int x, int y) {if (x == y) { tr[rt] = 1; return; }int mid = x + y >> 1;bdtr(ls, x, mid), bdtr(rs, mid + 1, y);tr[rt] = tr[ls] + tr[rs];
}
void update(int rt, int x, int y, int l, int r) {if (x > r || y < l) return;pushdown(rt);if (l <= x && y <= r) { tr[rt] = 0, lz[rt] = 1; return; }int mid = x + y >> 1;update(ls, x, mid, l, r), update(rs, mid + 1, y, l, r);tr[rt] = tr[ls] + tr[rs];
}
int query(int rt, int x, int y, int k) {if (x == y) return x;int mid = x + y >> 1;if (k <= tr[ls]) return query(ls, x, mid, k);else return query(rs, mid + 1, y, k - tr[ls]);
}
#undef ls
#undef rs
int findfa(int x) { return !fa[x] ? x : fa[x] = findfa(fa[x]); }
int main() {freopen("string.in", "r", stdin);freopen("string.out", "w", stdout);scanf("%s%d%d", s + 1, &K, &n), bdtr(1, 1, K);for (int i = 1; i <= n; i++) scanf("%d%d", &l[i], &r[i]);int tk = K;for (int i = n; i >= 1; i--) {if (r[i] >= tk) continue;int x = r[i] + 1, y = min(tk, r[i] + r[i] - l[i] + 1);int j = x;for (int p = l[i] + 1 - (l[i] & 1); j <= y && p <= r[i]; j++, p += 2) {int f1 = findfa(query(1, 1, K, j)), f2 = findfa(query(1, 1, K, p));if (f1 != f2) fa[f1] = f2;}for (int p = l[i] + (l[i] & 1); j <= y && p <= r[i]; j++, p += 2) {int f1 = findfa(query(1, 1, K, j)), f2 = findfa(query(1, 1, K, p));if (f1 != f2) fa[f1] = f2;}update(1, 1, K, query(1, 1, K, x), query(1, 1, K, y)), tk -= y - x + 1;}int M = strlen(s + 1);for (int i = 1; i <= M; i++) col[query(1, 1, K, i)] = i;for (int i = 1; i <= K; i++) printf("%c", s[col[findfa(i)]]);return 0;
}

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

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

相关文章

《C++ primer plus》精炼(OOP部分)——对象和类(8)

学习是一项持续的投资&#xff0c;永远不会白费——本杰明富兰克林 文章目录 第13章&#xff1a;类继承一个基类和派生类公有继承的逻辑关系&#xff1a;is-a多态公有继承 第13章&#xff1a;类继承 一个基类和派生类 从一个类派生出另一个类时&#xff0c;原始类称为基类&am…

怎么通过portainer部署一个vue项目

这篇文章分享一下今天通过docker打包vue项目&#xff0c;并使用打包的镜像在portainer上部署运行&#xff0c;参考了vue-cli和docker的官方文档。 首先&#xff0c;阅读vue-cli关于docker部署的说明 vue-cli关于docker部署的说明https://cli.vuejs.org/guide/deployment.html#…

信创办公–基于WPS的EXCEL最佳实践系列 (数据整理复制粘贴)

信创办公–基于WPS的EXCEL最佳实践系列 &#xff08;数据整理复制粘贴&#xff09; 目录 应用背景操作步骤1、数据查找与替换2、复制或粘贴数据3、使用自动填充工具4、将数据拆分到多列5、应用数字格式 应用背景 数据的整理复制粘贴等在日常的工作中经常使用。本章内容主要学习…

Codeforces Round 665 (Div. 2) (A-F)

A.Problem - A - Codeforces &#xff08;1&#xff09;题意 给你个X轴&#xff0c;初始A点在n这个位置&#xff0c;O在源点0&#xff0c;问你要把B放在哪才能让|AB-BO| k&#xff0c;最小化A需要移动多少次。 &#xff08;2&#xff09;思路 直接分情况套路即可。 &#xff0…

MySQL约束

文章目录 简单介绍主键约束添加单列主键多列主键删除主键 自增长约束(auto_increment)语法&#xff1a;指定自增字段初始值 非空约束唯一约束(unique)默认约束(default)零填充约束(zerofill) 简单介绍 概念&#xff1a;表中数据的约束条件 作用&#xff1a;表在设计的时候加入…

用AI原生向量数据库Milvus Cloud 搭建一个 AI 聊天机器人

搭建聊天机器人 一切准备就绪后,就可以搭建聊天机器人了。 文档存储 机器人需要存储文档块以及使用 Towhee 提取出的文档块向量。在这个步骤中,我们需要用到 Milvus。 安装轻量版 Milvus Lite,使用以下命令运行 Milvus 服务器: (chatbot_venv) [egoebelbecker@ares milvus_…

Python与Scrapy:构建强大的网络爬虫

网络爬虫是一种用于自动化获取互联网信息的工具&#xff0c;在数据采集和处理方面具有重要的作用。Python语言和Scrapy框架是构建强大网络爬虫的理想选择。本文将分享使用Python和Scrapy构建强大的网络爬虫的方法和技巧&#xff0c;帮助您快速入门并实现实际操作价值。 一、Pyt…

QSS之QComboBox

QComboBox在Qt开发过程中经常使用&#xff0c;默认的下载列表风格达不到设计师的要求&#xff0c;本篇介绍基本的QComboBox的qss设置。 属性意思QComboBoxQComboBox基本样式QComboBox:editable右边可选择按钮QComboBox:!editable, QComboBox::drop-down:editable不可编辑或下拉…

从“概念”到“应用”,字节跳动基于 DataLeap 的 DataOps 实践

更多技术交流、求职机会&#xff0c;欢迎关注字节跳动数据平台微信公众号&#xff0c;回复【1】进入官方交流群 近日&#xff0c;火山引擎数智平台 VeDI Meetup「超话数据」在深圳举办&#xff0c;来自火山引擎的产品专家分享了字节跳动基于 DataLeap 的 DataOps 实践&#xff…

Audacity 使用教程:轻松录制、编辑音频

Audacity 使用教程&#xff1a;轻松录制、编辑音频 1. 简介 Audacity 是一款免费、开源且功能强大的音频录制和编辑软件。它适用于 Windows、Mac 和 Linux 等多种操作系统&#xff0c;适合音乐制作、广播后期制作以及普通用户进行音频处理。本教程将带领大家熟悉 Audacity 的…

管道-匿名管道

一、管道介绍 管道&#xff08;Pipe&#xff09;是一种在UNIX和类UNIX系统中用于进程间通信的机制。它允许一个进程的输出直接成为另一个进程的输入&#xff0c;从而实现数据的流动。管道是一种轻量级的通信方式&#xff0c;用于协调不同进程的工作。 1. 创建和使用管道&#…

机器人中的数值优化|【七】线性搜索牛顿共轭梯度法、可信域牛顿共轭梯度法

机器人中的数值优化|【七】线性搜索牛顿共轭梯度法、可信域牛顿共轭梯度法 Line Search Newton-CG, Trust Region Newton-CG 往期回顾 机器人中的数值优化|【一】数值优化基础 机器人中的数值优化|【二】最速下降法&#xff0c;可行牛顿法的python实现&#xff0c;以Rosenbro…

解决Invalid bound statement (not found)错误~

报错如下所示&#xff1a; 找了好久&#xff0c;刚开始以为是名称哪里写的有问题&#xff0c;但仔细检查了好多遍都不是 最后发现了问题如下所示&#xff1a; UserMapper里面的内容被我修改了&#xff0c;但classes中的内容还是原来的内容&#xff0c;所以才导致了编译器报错n…

【计算机网络】HTTP协议详解(举例解释,超级详细)

文章目录 一、HTTP协议简单介绍 1、1 什么是HTTP协议 1、2 再次理解“协议” 二、HTTP请求 2、1 HTTP的工作过程 2、1、1 demo代码 2、2 URL 介绍 2、2、1 urlencode 和 urldecode 2、3 HTTP 请求格式 三、HTTP响应 3、1 响应demo 3、2 HTTP 响应格式 四、HTTP 请求和响应中的…

【改进哈里鹰算法(NCHHO)】使用混沌和非线性控制参数来提高哈里鹰算法的优化性能,解决车联网相关的路由问题(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

ENVI报错:SaveRasterFile failed:IDLnaMetadata Error

ENVI报错&#xff1a;SaveRasterFile failed:IDLnaMetadata Error 问题描述 ENVI在另存为为TIFF文件时&#xff0c;报了下面这个错误信息 原因 输出路径或者是存放影像的路径里面包含中文&#xff0c;不能包含中文 解决方案 把所有相关路径中的中文改成英文

嵌入式学习笔记(42)SD卡的编程接口

8.3.1 SD卡的物理接口 SD卡由9个针脚与外界进行物理连接&#xff0c;这9个脚中有2个地&#xff0c;1个电源&#xff0c;6个信号线。 8.3.2 SD协议与SPI协议 (1)SD卡与SRAM/DDR/SROM之类的东西的不同&#xff1a;SRAM/DDR/SROM之类的存储芯片是总线式的&#xff0c;只要连接上…

深入学习git

1、git原理及整体架构图 一些常用的命令 git add . 或 git add src/com/ygl/hello/hello.java 指定文件 git commit . 或 git commit src/com/ygl/hello/hello.java 指定文件 git push origin 分支名称 2、git stash的应用场景 场景一&#xff1a;你正在当前分支A开发&…

司空见惯 - 奈尔宝的NTTP

联合国对21世纪人才定义的标准&#xff0c;包括六种核心技能&#xff0c;即批判性思维&#xff08;critical thinking)、人际交往&#xff08;communication)、与人合作&#xff08;collaboration)、创造性&#xff08;creativity)、信息素养&#xff08;information literacy)…

controller-manager学习三部曲之一:通过脚本文件寻找程序入口

欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码)&#xff1a;https://github.com/zq2599/blog_demos 关于《controller-manager学习三部曲》 《controller-manager学习三部曲》是欣宸原创的kubernetes深入学习系列之一&#xff0c;在前面的《client-go实战》系…