维护一个字符串,支持以下操作:
主要就是 成段插入、成段删除、成段翻转。前两个操作很好通过rope实现。第三个操作也不难,维护两个rope,一个正向,一个反向,翻转时swap一下就行了。
rope教程: http://blog.csdn.net/iamzky/article/details/38348653
Code(Orz zky):
1 #include<cstdio> 2 #include<ext/rope> 3 using namespace std; 4 using namespace __gnu_cxx; 5 crope a,b,tmp; 6 int n,p,sz,len,res; 7 char op[21],s[2000001],r[2000001],c; 8 inline int getint(){res=0;c='*';while(c<'0'||c>'9')c=getchar();while(c>='0'&&c<='9'){res=res*10+(c-'0');c=getchar();}return res;} 9 int main() 10 { 11 scanf("%d",&n); 12 for(;n>0;n--) 13 { 14 scanf("%s",op); 15 if(op[0]=='M')p=getint(); 16 else if(op[0]=='P')p--; 17 else if(op[0]=='N')p++; 18 else if(op[0]=='G'){putchar(a[p]);putchar(' ');} 19 else if(op[0]=='I') 20 { 21 sz=getint(); 22 len=a.length(); 23 for(int i=0;i<sz;i++){ 24 do{s[i]=getchar();}while(s[i]==' '); 25 r[sz-i-1]=s[i]; 26 } 27 s[sz]=r[sz]='