神奇玩意@mocha
STL大法好!这个用了个rope
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个元素 |
#include<cstdio> #include<iostream> #include<cstring> #include<cstdlib> #include<algorithm> #include<cmath> #include<ext/rope> using namespace std; using namespace __gnu_cxx; rope<char>a,b,t; char op[30],ss[2100000],rs[2100000]; int main() { int n,k=0,x,len; scanf("%d",&n); while(n--) { scanf("%s",op+1); if(op[1]=='M')scanf("%d",&k); else if(op[1]=='P')k--; else if(op[1]=='N')k++; else if(op[1]=='G')printf("%c ",a[k]); else if(op[1]=='I') { scanf("%d",&x);len=a.length(); for(int i=0;i<x;i++) { ss[i]=getchar(); while(ss[i]==' ')ss[i]=getchar(); rs[x-i-1]=ss[i]; } rs[x]=ss[x]=0; a.insert(k,ss); b.insert(len-k,rs); } else if(op[1]=='D') { scanf("%d",&x);len=a.length(); a.erase(k,x); b.erase(len-k-x,x); } else if(op[1]=='R') { scanf("%d",&x);len=a.length(); t=a.substr(k,x); a=a.substr(0,k)+b.substr(len-k-x,x)+a.substr(k+x,len-k-x); b=b.substr(0,len-k-x)+t+b.substr(len-k,k); } } return 0; }