概述

std::rope,内部一说是可持久化平衡树,一说是块状链表。

它可以实现很多可持久化数组问题。

基本使用

#include<bits/extc++.h>
using namespace __gnu_cxx; // 引入rope rope<char> a; //建立一个存储char的rope
crope a; //crope实际上就是rope<char> a.push_back('Y'); //在rope尾部新增一个元素
a[1]; // 获得 1 处元素
a.at(1); // 实际上就是 a[1]
rope<char> b=a; // 赋值

我们可以使用rope数组来实现可持久化数组。

P1383 高级打字机

早苗入手了最新的高级打字机。最新款自然有着与以往不同的功能,那就是它具备撤销功能,厉害吧。

请为这种高级打字机设计一个程序,支持如下 \(3\) 种操作:

1.T x:在文章末尾打下一个小写字母 \(x\)。(type 操作 )

2.U x:撤销最后的 \(x\) 次修改操作。(Undo 操作)

(注意 Query 操作并不算修改操作)

  1. Q x:询问当前文章中第 \(x\) 个字母并输出。(Query 操作)

文章一开始可以视为空串。

对于 \(100\%\) 的数据 \(n \le 100000\);保证 Undo 操作不会撤销 Undo 操作。

这道题正解主席树,当然也可以rope。

代码如下:

#include <bits/stdc++.h>
#include <bits/extc++.h>
using namespace std;
using namespace __gnu_cxx; const int N = 100000;
int cnt=-1,n;
crope *now[N];
char op,ch;int num; int main(){
cin>>n;
now[++cnt]=new crope();
for(int i=1;i<=n;i++){
cin>>op;
if(op=='T'){
cin>>ch;
cnt++;
now[cnt]=new crope(*now[cnt-1]); //new version
now[cnt]->push_back(ch);
}
if(op=='U'){
cin>>num;
cnt++;
now[cnt]=new crope(*now[cnt-num-1]);
}
if(op=='Q'){
cin>>num;
cout<<now[cnt]->at(num-1)<<'\n';
}
}
return 0;
}

P6166 [IOI2012] scrivener

有些人说李奥纳多是一个对于 Johannes Gutenberg 的崇拜者,Johannes 是一个发明活字印刷的德国铁匠,为了表达尊敬,李奥纳多设计了一台机器被称为小龙虾代书,那是一个非常简单的打字设备。这机器就像一部简单的现代打字机,但只能接受两个指令。一个指令是 输出一个字符,另一个指令是取消最近的指令。小龙虾代书的最大特点就是拥有这个功能强大的取消指令。因为一个取消指令本身也是一个指令,所以也可以被取消。

你的任务是作出此小龙虾代书的程序,一开始并无输出任何文字,然后开始接受使用者输入的一连串指令,并可查询目前输出文字中的特定位置的字符。详细说明如下:

  • TypeLetter(L) —附加一个小写字母L在输出文字的最后,\(L\) 可以是 \(a,b,\cdots, z\)。

  • UndoCommands(U) — 取消之前的 \(U\) 个指令,\(U\) 是一个正整数。

  • GetLetter(P) — 回传在输出文字中位置为 \(P\) 的字符,\(P\) 是一个非负整数。 输出文字中的第一个字符的位置为 \(0\)。 (这个查询并不是一个指令,因此会被取消指令忽略。)

三种操作可以依照任何顺序被呼叫 \(0\) 次或多次以上。

指令 UndoCommands(U) 会依照原本执行的相反顺序来取消前面 \(U\) 个指令: 如果被取消的指令是 TypeLetter(L),就会从输出文字最后面移除字母 \(L\)。如果被取消的指令是 UndoCommands(X),那么将会依照原本执行的顺序重新执行之前被取消的 \(X\) 个指令。

对于 \(100\%\) 的数据,\(1 \le N \le 10^6\)。参数 \(U\) 保证不会超过前面已经输入的指令数目,而且参数 \(P\) 一定小于输出文字的长度(也就是输出文字的字母数)。

这道题跟上一题差不多。

#include <bits/stdc++.h>
#include <bits/extc++.h>
using namespace std;
using namespace __gnu_cxx; const int N = 1e6+5;
int cnt,q;
crope now[N];
char op,ch;int num; int main(){
cin>>q;
while(q--){
cin>>op;
if(op=='P'){
cin>>num;
cout<<now[cnt][num]<<'\n';
}
if(op=='T'){
cnt++;
cin>>ch;
now[cnt]=now[cnt-1];
now[cnt].append(ch);
}
if(op=='U'){
cnt++;
cin>>num;
now[cnt]=now[cnt-num-1];
}
}
return 0;
}

可持久化杀手——rope学习笔记的更多相关文章

  1. [原创]java WEB学习笔记77:Hibernate学习之路---Hibernate 版本 helloword 与 解析,.环境搭建,hibernate.cfg.xml文件及参数说明,持久化类,对象-关系映射文件.hbm.xml,Hibernate API (Configuration 类,SessionFactory 接口,Session 接口,Transaction(事务))

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  2. [学习笔记]可持久化数据结构——数组、并查集、平衡树、Trie树

    可持久化:支持查询历史版本和在历史版本上修改 可持久化数组 主席树做即可. [模板]可持久化数组(可持久化线段树/平衡树) 可持久化并查集 可持久化并查集 主席树做即可. 要按秩合并.(路径压缩每次建 ...

  3. Android:日常学习笔记(9)———探究持久化技术

    Android:日常学习笔记(9)———探究持久化技术 引入持久化技术 什么是持久化技术 持久化技术就是指将那些内存中的瞬时数据保存到存储设备中,保证即使在手机或电脑关机的情况下,这些数据仍然不会丢失 ...

  4. tensorflow学习笔记——模型持久化的原理,将CKPT转为pb文件,使用pb模型预测

    由题目就可以看出,本节内容分为三部分,第一部分就是如何将训练好的模型持久化,并学习模型持久化的原理,第二部分就是如何将CKPT转化为pb文件,第三部分就是如何使用pb模型进行预测. 一,模型持久化 为 ...

  5. Redis学习笔记六:持久化实验(AOF,RDB)

    作者:Grey 原文地址:Redis学习笔记六:持久化实验(AOF,RDB) Redis几种持久化方案介绍和对比 AOF方式:https://blog.csdn.net/ctwctw/article/ ...

  6. Adaptive AUTOSAR 学习笔记 15 - 持久化 Persistency

    本系列学习笔记基于 AUTOSAR Adaptive Platform 官方文档 R20-11 版本 AUTOSAR_EXP_PlatformDesign.pdf.作者:Zijian/TENG 原文地 ...

  7. 【原】Learning Spark (Python版) 学习笔记(三)----工作原理、调优与Spark SQL

    周末的任务是更新Learning Spark系列第三篇,以为自己写不完了,但为了改正拖延症,还是得完成给自己定的任务啊 = =.这三章主要讲Spark的运行过程(本地+集群),性能调优以及Spark ...

  8. Linux 学习笔记

    Linux学习笔记 请切换web视图查看,表格比较大,方法:视图>>web板式视图 博客园不能粘贴图片吗 http://wenku.baidu.com/view/bda1c3067fd53 ...

  9. SQLite学习笔记(七)&&事务处理

    说到事务一定会提到ACID,所谓事务的原子性,一致性,隔离性和持久性.对于一个数据库而言,通常通过并发控制和故障恢复手段来保证事务在正常和异常情况下的ACID特性.sqlite也不例外,虽然简单,依然 ...

  10. Redis学习笔记4-Redis配置详解

    在Redis中直接启动redis-server服务时, 采用的是默认的配置文件.采用redis-server   xxx.conf 这样的方式可以按照指定的配置文件来运行Redis服务.按照本Redi ...

随机推荐

  1. 齐博x1更新了 提供一个部分用户期待已久的功能,修改主题后变为待审

    如下图所示,你可以设置哪些用户组修改主题后,就会把原来已审核通过的主题,变为未审核.适合所有频道.

  2. 【ps下载与安装】Adobe Photoshop 2022 for Mac v23.5 中文永久版下载 Ps图像编辑软件

    Adobe Photoshop 2022 mac破解版,是一款Ps图像编辑软件,同时支持M1/M2芯片和Intel芯片安装,此主要的更新包括多个新增和改进的功能,例如改进的对象选择工具,其悬停功能可预 ...

  3. python基础之标识符、注释与变量

    一.注释 1.作用:注释是用来解释和说明代码的. 2.分类:注释可以分为单行注释和多行注释 2.1.单行注释:在编写的代码或文字前加上"#",表示单行注释 1 #我是单行注释 2 ...

  4. django 生产环境部署手册

    Django 是 python 的 web 框架,以下是其部署到生产环境的详细步骤,包含 Apache 和 nginx 版本. 部署环境 操作系统:centeros7.3 数据库:MySQL5.6.5 ...

  5. C# 7.0 添加和增强的功能【基础篇】

    C# 7.0 版是与 Visual Studio 2017 一起发布. 虽然该版本继承和发展了C# 6.0,但不包含编译器即服务. 一.out 变量 以前我们使用out变量必须在使用前进行声明,C# ...

  6. Vue实现离开页面二次确认

    在项目开发中遇到用户编辑内容后未保存推出编辑页面时需要提示用户"当前数据未保存,是否退出",实际开发中利用window.onbeforeunload方法与vue.$on方法在upd ...

  7. 第2-1-4章 SpringBoot整合FastDFS文件存储服务

    目录 5 SpringBoot整合 5.1 操作步骤 5.2 项目依赖 5.3 客户端开发 5.3.1 FastDFS配置 5.3.2 FastDFS配置类 5.3.3 文件工具类 5.3.4 文件上 ...

  8. 工作中,本人常用到的unzip、zip命令

    1. 命令安装 1.1 zip安装 yum install zip 1.2 unzip安装 yum install unzip 2. 常用命令 2.1 常用zip命令 2.1.1 压缩文件 zip x ...

  9. Vue2 到 Vue3,重温这 5 个常用的 API

    距离Vue3发布已经过去一年多时间了,从Vue2到Vue3是一个不小的升级,包括周边生态等.虽然目前大多数开发者们在使用的仍旧以Vue2为准,但Vue3显然是Vue开发者们未来必须面对的,而且前不久V ...

  10. 如何通过Java代码给Word文档添加水印?

    Word中可以为文档添加的水印分为两种形式:文字水印和图片水印.水印是一种数字保护的手段,在文档上添加水印可以传达有用信息,或者在不影响正文文字显示效果的同时,为打印文档增添视觉趣味,能起到传递信息, ...