[STL] 浅谈Rope使用(附[BZOJ]1507 Editor)

本文介绍了Rope这一数据结构,它是块状链表的一种实现,结合了链表和数组的优点,适用于快速的字符串插入、删除和查找。文章通过分析NOI2003文本编辑器问题,展示了Rope在解决此类问题上的高效性,并提供了相关的代码实现。

前言

今天做一道题:BZOJ1507: [NOI2003]Editor,然后用splay打了一个,真的心累。然后看网上的做法,竟然有人用不到40行的代码A掉了这题,然后一看,就是今天要谈的Rope。

简介

在2008年OI集训论文上有介绍《对块状链表的一点研究》,块状链表主要是结合了链表和数组各自的优点,链表中的节点指向每个数据块,即数组,并且记录数据的个数,然后分块查找和插入。在g++头文件中,ext/rope中有成型的块状链表,在using namespace __gnu_cxx;空间中,使用起来是比较的方便的。
其实可以把它认为是可持久化平衡树吧。

基本操作

#include <cstdio>
#include <ext/rope>
using namespace std;
using namespace __gnu_cxx;
//要用的头文件和命名空间等
rope test;//定义
test.push_back(x);//在末尾添加x
test.insert(pos,x);//在pos插入x  
test.erase(pos,x);//从pos开始删除x个
test.copy(pos,len,x);//从pos开始到pos+len为止用x代替
test.replace(pos,x);//从pos开始换成x
test.substr(pos,x);//提取pos开始x个
test.at(x)/[x];//访问第x个元素

其算法复杂度

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值