首页 > 代码库 > 【rope】bzoj1269 [AHOI2006]文本编辑器editor
【rope】bzoj1269 [AHOI2006]文本编辑器editor
维护一个字符串,支持以下操作:
主要就是 成段插入、成段删除、成段翻转。前两个操作很好通过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(‘\n‘);}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]==‘\n‘);25 r[sz-i-1]=s[i];26 }27 s[sz]=r[sz]=‘\0‘;28 a.insert(p,s);29 b.insert(len-p,r);30 }31 else if(op[0]==‘D‘)32 {33 sz=getint();34 len=a.length();35 a.erase(p,sz);36 b.erase(len-p-sz,sz);37 }38 else if(op[0]==‘R‘)39 {40 sz=getint();41 len=a.length();42 tmp=a.substr(p,sz);43 a=a.substr(0,p)+b.substr(len-p-sz,sz)+a.substr(p+sz,len-p-sz);44 b=b.substr(0,len-p-sz)+tmp+b.substr(len-p,p);45 }46 }47 return 0;48 }
【rope】bzoj1269 [AHOI2006]文本编辑器editor
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。