概述

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. 2、第二种传输数据的形式:使用ajax传输数据,将前台的数据传输到后端

    第一种使用form表单中的action形式传输数据:https://blog.csdn.net/weixin_43304253/article/details/120335282 前端页面 <% ...

  2. Android 13 新特性及适配指南

    Android 13(API 33)于 2022年8月15日 正式发布(发布时间较往年早了一些),正式版Release源代码也于当日被推送到AOSP Android开源项目. 截止到笔者撰写这篇文章时 ...

  3. VUE v-model 语法糖

    v-model 语法糖 描述:弹出利用v-model语法糖 父组件 子组件

  4. Blog2:nchu-software-oop-2022-4+5+期中

    Blog2:nchu-software-oop-2022-4+5+期中 一.前言 两次大作业是关于四边形和五边形的相关操作,类似于之前的三角形,但由于图形边数的变化,难度大大增加.对数学知识的运用考察 ...

  5. nrf9160 做modem—— 连接云(接入方式MQTT)

    今天测试把nrf9160作为modem的例程Serial LTE Modem程序(后面简称slm),何为做modem,通俗来说就是将nrf9160作为无线模块,主控由其余MCU做,主控通过AT命令控制 ...

  6. Sublime Text4(Build 4126) 安装备忘

    Sublime Text4(Build 4126) 安装备忘 sublime text 4126 PJ已测可用 打开浏览器进入网站https://hexed.it 打开sublime text4安装目 ...

  7. numpy常用知识点备忘

    常用函数 a.max(axis=0) a.max(axis=1) a.argmax(axis=1) : 每列的最大值(在行方向找最大值).每行的最大值(在列方向找对大致).最大值的坐标 sum()求和 ...

  8. 简单的sql注入3

    仍然 1 1' 1" 发现1'报错了.....我觉得作者对'情有独钟 再试试 1# 1'# 1"# 发现都可以正常登录 试试1' and '1'='1和1' and '1'='2发 ...

  9. python-简单模块的使用

    提示:简单模块了解掌握 @ 目录 uuid模块 calendar日历模块 time模块 datetime模块 os模块 sys模块 random模块 json和pickle模块 json pickle ...

  10. 保存sklearn中模型的两种方法(pickle、joblib)

    保存sklearn中模型的两种方法(pickle.joblib) from sklearn import svm from sklearn import datasets clf = svm.SVC( ...