这是改了一些之后的。
```cpp
#include<bits/stdc++.h>
using namespace std;
int now,x,q,n;
const int mxn=2e3+10;
struct node{
int nxt,siz;
char ch[mxn<<1];
}bl[mxn<<2];
int pool[mxn<<2],cnt;
char ans[20000010],ch[10];
void del(int x){
pool[--cnt]=x;
}
int modi(){
return pool[cnt++];
}
int find_pos(int &x){
int p=0;
while(p!=-1&&x>bl[p].siz)x-=bl[p].siz,p=bl[p].nxt;
return p;
}
void add(int x,int y,int len,char c[]){
if(y!=-1){
bl[y].nxt=bl[x].nxt,bl[y].siz=len;
memcpy(bl[y].ch,c,len);
}
bl[x].nxt=y;
}
void split(int be,int pos){
if(be==-1||pos==bl[be].siz)return;
add(be,modi(),bl[be].siz-pos,bl[be].ch+pos);
bl[be].siz=pos;
}
void merge(int x,int y){
memcpy(bl[x].ch+bl[x].siz,bl[y].ch,bl[y].siz);
bl[x].siz+=bl[y].siz,bl[x].nxt=bl[y].nxt;
del(y);
}
void insert(int pos,int len,char c[]){
int be=find_pos(pos);
split(be,pos);
int tot=0,ne,st=be;
while(tot+mxn<=len){
ne=modi();
add(be,ne,mxn,c+tot);
tot+=mxn;
be=ne;
}
if(len>tot)ne=modi(),add(be,ne,len-tot,c+tot);
if(bl[be].siz+bl[ne].siz<mxn&&ne!=-1)merge(be,ne),ne=bl[be].nxt;
if(bl[st].siz+bl[bl[st].nxt].siz<mxn&&bl[st].nxt!=-1)merge(st,bl[st].nxt);
}
void remove(int pos,int len){
int be=find_pos(pos);
split(be,pos);
int nxt=bl[be].nxt;
while(nxt!=-1&&len>bl[nxt].siz){
len-=bl[nxt].siz;
nxt=bl[nxt].nxt;
}
split(nxt,len);
nxt=bl[nxt].nxt;
for(int i=bl[be].nxt;i!=nxt;i=bl[be].nxt){
bl[be].nxt=bl[i].nxt;
del(i);
}
while(bl[now].siz+bl[nxt].siz<mxn&&nxt!=-1){
merge(be,nxt);
nxt=bl[be].nxt;
}
}
void get(int pos,int len){
int cur=find_pos(pos);
int tot=bl[cur].siz-pos;
if(len<tot)tot=len;
memcpy(ans,bl[cur].ch+pos,tot);
int be=bl[cur].nxt;
while(be!=-1&&len>=tot+bl[be].siz){
memcpy(ans+tot,bl[be].ch,bl[be].siz);
tot+=bl[be].siz,be=bl[be].nxt;
}
if(len-tot>0&&be!=-1)memcpy(ans+tot,bl[be].ch,len-tot);
ans[len]='\0';
printf("%s\n",ans);
}
int main(){
scanf("%d",&q);
for(int i=1;i<(mxn<<2);i++)pool[i]=i;
cnt=1;
bl[0].siz=0,bl[0].nxt=-1;
for(int i=1;i<=q;i++){
scanf("%s",ch);
if(ch[0]=='M'){
int x;
scanf("%d",&x);
now=x;
}
if(ch[0]=='I'){
scanf("%d",&n);
for(int i=0;i<n;i++){
ans[i]=getchar();
while(ans[i]<32||ans[i]>126)ans[i]=getchar();
}
insert(now,n,ans);
}
if(ch[0]=='D'){
int x;
scanf("%d",&x);
remove(now,x);
}
if(ch[0]=='G'){
int x;
scanf("%d",&x);
get(now,x);
}
if(ch[0]=='P')now--;
if(ch[0]=='N')now++;
}
return 0;
}
```
by Jerry_heng @ 2024-01-23 18:52:09