UVA12538 Version Controlled IDE 题解 crope

Version Controlled IDE

传送门

题面翻译

维护一种数据结构,资磁三种操作。

1.在p位置插入一个字符串s

2.从p位置开始删除长度为c的字符串

3.输出第v个历史版本中从p位置开始的长度为c的字符串

1 ≤ n ≤ 50000 1 \leq n \leq 50000 1≤n≤50000,所有字符串总长度小于等于 1 0 6 10^6 106,输出字符串总长度小于等于 20000 20000 20000

强制在线,每次输入中的数字都要减去你的所有输出中字母c的个数

Translated by @litble

题目描述

PDF

输入格式

输出格式

样例 #1

样例输入 #1

复制代码
6
1 0 abcdefgh
2 4 3
3 1 2 5
3 3 3 4
1 4 xy
3 5 4 6

样例输出 #1

复制代码
bcdef
bcg
bxyc

注明

以上来自 U V a ,翻译来源:洛谷。 以上来自 UVa,翻译来源:洛谷。 以上来自UVa,翻译来源:洛谷。

不如在洛谷看 UVa 的题,在 vjudge 上交。

易懂版题面来自大佬 @shiyihang

解题思路

前置知识

  • crope [ 1 ] ^{[1]} [1]。

正文

需要简化一下题意:

初始有一个空字符串,下标从 1 1 1 开始,进行 N N N 次操作:

  1. 在第 p p p 个字符后插入一个字符串 s s s 。
  2. 删除从第 p p p 个字符(包括第 p p p 个)开始的长度为 c c c 的字符串。
  3. 输出第 v v v 个历史版本中从 p p p 个字符(包括第 p p p 个)开始的长度为 c c c 的字符串。

每次 1 , 2 1,2 1,2 操作形成一个新的版本,初始版本为 0 0 0,编号依次递增。强制在线 ,每一个输入中的数字减去目前所有输出中字母 c 的个数才是题目描述中的值。

对于所有的数据,满足以下条件:

  • 2 ≤ N ≤ 5 × 1 0 4 2 \le N \le 5 \times 10^4 2≤N≤5×104 ;
  • 0 ≤ p ≤ 1 0 6 0 \le p \le 10^6 0≤p≤106;
  • 0 < ∣ s ∣ , c ≤ 1 0 6 0 \lt |s|, c \le 10^6 0<∣s∣,c≤106。

保证输入数据中的 v v v 在 1 1 1 到 先前输入中 操作一或二 的总数 之间。

对于 2 , 3 2,3 2,3 操作,保证子串不超过原串末尾 p + c ≤ ∣ s ∣ p + c \le |s| p+c≤∣s∣。

很好的 crope 模版题,直接用 crope 按照题意模拟即可。

AC Code

cpp 复制代码
#include<bits/stdc++.h>
#include<ext/rope>
using namespace std;
using namespace __gnu_cxx;
int n;
char s[1000005];
crope Rope, His[50005];
int Length;
signed main() {
	ios::sync_with_stdio(false), cin.tie(0), cout.tie(0), cin >> n;
	int opt, v, p, c, sum = 0;
	crope temp;
	while (n--) {
		cin >> opt;
		if (opt == 1) cin >> p >> s, p -= sum, Rope.insert(p, s), His[++Length] = Rope;
		else if (opt == 2) cin >> p >> c, p -= sum, c -= sum, Rope.erase(p - 1, c), His[++Length] = Rope;
		else cin >> v >> p >> c, v -= sum, p -= sum, c -= sum, temp = His[v].substr(p - 1, c), sum += count(temp.begin(), temp.end(), 'c'), cout << temp << endl;
	}
	return 0;
}

资料来源

  • 1\]:博客园 @[mekdull](https://home.cnblogs.com/u/mekdull) [实用 STL ------ rope 学习笔记](https://www.cnblogs.com/mekdull/p/17893879.html)。

相关推荐
是苏浙17 小时前
零基础入门C语言之C语言实现数据结构之顺序表应用
c语言·数据结构·算法
AA陈超17 小时前
虚幻引擎5 GAS开发俯视角RPG游戏 P07-08 点击移动
c++·游戏·ue5·游戏引擎·虚幻
lkbhua莱克瓦2417 小时前
Java基础——常用算法3
java·数据结构·笔记·算法·github·排序算法·学习方法
小白程序员成长日记17 小时前
2025.11.07 力扣每日一题
数据结构·算法·leetcode
·白小白17 小时前
力扣(LeetCode) ——209. 长度最小的子数组(C++)
c++·算法·leetcode
小猪咪piggy17 小时前
【算法】day16 动态规划
算法·动态规划
ohnoooo917 小时前
251106 算法
数据结构·c++·算法
uesowys18 小时前
华为OD算法开发指导-简易内存池
java·算法·华为od
Greedy Alg18 小时前
LeetCode 155. 最小栈
算法
卡提西亚18 小时前
C++笔记-24-文件读写操作
开发语言·c++·笔记