您的位置:首页 > 其它

【bzoj1269】[AHOI2006]文本编辑器editor

2016-03-25 21:06 387 查看
在bzoj上乱翻,发现了可持久化并查集,然后baidu了一下,发现一种叫rope的东西。

!!!真的太爽了!!!

直接上代码,感受一下(也是蒯来的)。

#include<algorithm>

#include<ext/rope>

#include<iostream>

#include<cstdlib>

#include<cstring>

#include<cstdio>

#include<cmath>

#include<queue>

#include<set>

using
namespace
__gnu_cxx;

using
namespace
std;


#define N 2000010


crope a,b,tmp;


char
str
,rstr
;


char
ch[10];


int
n;

int
k,len,s;


int
main()

{

scanf
(
"%d"
,&n);

while
(n--)

{

scanf
(
"%s"
,ch);

switch
(ch[0])

{

case
'M'
:

scanf
(
"%d"
,&k);

break
;

case
'P'
:

k--;

break
;

case
'N'
:

k++;

break
;

case
'G'
:

putchar
(a[k]);

putchar
(
'\n'
);

break
;

case
'I'
:

scanf
(
"%d"
,&s);

len=a.length();

for
(
int
i=0;i<s;i++)

{

do

{

str[i]=
getchar
();

}
while
(str[i]==
'\n'
);

rstr[s-i-1]=str[i];

}

rstr[s]=str[s]=
'\0'
;

a.insert(k,str);

b.insert(len-k,rstr);

break
;

case
'D'
:

scanf
(
"%d"
,&s);

len=a.size();

a.erase(k,s);

b.erase(len-k-s,s);

break
;

case
'R'
:

scanf
(
"%d"
,&s);

len=a.size();

tmp=a.substr(k,s);

a=a.substr(0,k)+b.substr(len-k-s,s)+a.substr(k+s,len-k-s);

b=b.substr(0,len-k-s)+tmp+b.substr(len-k,k); 

break
;

}

}

return
0;

}


由于rope的底层实现,insert,erase,get都是logn的

就是翻转不行,不是自己手写的打不了标记。

rope的部分简单操作

函数功能
push_back(x)在末尾添加x
insert(pos,x)在pos插入x
erase(pos,x)从pos开始删除x个
replace(pos,x)从pos开始换成x
substr(pos,x)提取pos开始x个
at(x)/[x]访问第x个元素

参考博客:http://blog.csdn.net/iamzky/article/details/38348653
在此表示感谢!!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: