~~去你的萌新~~
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