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

在bzoj上乱翻,发现了可持久化并查集,然后baidu了一下,发现一种叫rope的东西。

 
!!!真的太爽了!!!
 
直接上代码,感受一下(也是蒯来的)。
 
 
 
由于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
 1 #include<algorithm>
 2 #include<ext/rope>
 3 #include<iostream>
 4 #include<cstdlib>
 5 #include<cstring>
 6 #include<cstdio>
 7 #include<cmath>
 8 #include<queue>
 9 #include<set>
10 using namespace __gnu_cxx;
11 using namespace std;
12  
13 #define N 2000010
14  
15 crope a,b,tmp;
16  
17 char str[N],rstr[N];
18  
19 char ch[10];
20  
21 int n;
22 int k,len,s;
23  
24 int main()
25 {
26     scanf("%d",&n);
27     while (n--)
28     {
29         scanf("%s",ch);
30         switch (ch[0])
31         {
32             case 'M':
33                 scanf("%d",&k);
34                 break;
35             case 'P':
36                 k--;
37                 break;
38             case 'N':
39                 k++;
40                 break;
41             case 'G':
42                 putchar(a[k]);
43                 putchar('
');
44                 break;
45             case 'I':
46                 scanf("%d",&s);
47                 len=a.length();
48                 for (int i=0;i<s;i++)
49                 {
50                     do
51                     {
52                         str[i]=getchar();
53                     }while (str[i]=='
');
54                     rstr[s-i-1]=str[i];
55                 }
56                 rstr[s]=str[s]=''; 
57                 a.insert(k,str); 
58                 b.insert(len-k,rstr); 
59                 break; 
60             case 'D':
61                 scanf("%d",&s); 
62                 len=a.size(); 
63                 a.erase(k,s); 
64                 b.erase(len-k-s,s); 
65                 break; 
66             case 'R':
67                 scanf("%d",&s); 
68                 len=a.size(); 
69                 tmp=a.substr(k,s); 
70                 a=a.substr(0,k)+b.substr(len-k-s,s)+a.substr(k+s,len-k-s); 
71                 b=b.substr(0,len-k-s)+tmp+b.substr(len-k,k);                
72                 break;
73         }
74     }
75     return 0;
76 }
原文地址:https://www.cnblogs.com/yangjiyuan/p/5321191.html