求调qwq

P4008 [NOI2003] 文本编辑器

这是改了一些之后的。 ```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


|