【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('\n'); 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]=='\n'); 54 rstr[s-i-1]=str[i]; 55 } 56 rstr[s]=str[s]='\0'; 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 }