萌新刚学块链,求助

P4008 [NOI2003] 文本编辑器

~~去你的萌新~~
by hard_fang @ 2022-12-19 13:29:19


@[junxis](/user/551375) 强烈建议用若干个deque维护固定块长的结构
by K2Cr2O7 @ 2023-02-03 13:51:06


就像这样 ```cpp #include<bits/stdc++.h> #define il inline using namespace std; const int SIZE=6004; char op[SIZE*SIZE],con[SIZE*SIZE]; int t,now,tmp,sz,tot; deque < char > v[3004]; il int blk(const int &p){ return p%SIZE==0?p/SIZE-1:p/SIZE; } il int pos(const int &p){ return p%SIZE==0?SIZE-1:p%SIZE-1; } il int vis(const int &p){ return v[blk(p)][pos(p)]; } il void insert(const int &p,const char &x){ int b=blk(p),ind=pos(p); v[b].insert(v[b].begin()+ind,x); for(int i=b;i<=tot;i++){ if(i==tot&&v[i].size()<=SIZE) break; v[i+1].push_front(v[i].back()); v[i].pop_back(); } ++sz; if(v[tot+1].size()) ++tot; } il void erase(const int &p){ int b=blk(p),ind=pos(p); v[b].erase(v[b].begin()+ind); for(int i=b;i<tot;i++){ v[i].push_back(v[i+1].front()); v[i+1].pop_front(); } --sz; if(v[tot].size()==0) --tot; } il void reply(int p,int len){ for(int i=p;i<p+len;i++) putchar(v[blk(i)][pos(i)]); puts(""); } signed main() { scanf("%d",&t); while(t--){ scanf("%s",op); if(op[0]=='I'){ scanf("%d",&tmp); for(int i=0;i<tmp;i++){ con[i]=getchar(); if(con[i]=='\n'||con[i]=='\r') i--; } for(int i=0;i<tmp;i++){ insert(now+1,con[i]); ++now; } now-=tmp; } if(op[0]=='M'){ scanf("%d",&tmp); now=tmp; } if(op[0]=='D'){ scanf("%d",&tmp); while(tmp--) erase(now+1); } if(op[0]=='G'){ scanf("%d",&tmp); reply(now+1,tmp); } if(op[0]=='P') --now; if(op[0]=='N') ++now; } return 0; } ```
by K2Cr2O7 @ 2023-02-03 13:51:50


|