如题。本题块状数组做法,pointer 维护的是光标左侧的位置。
#include<bits/stdc++.h>
#define int long long
using namespace std;
struct node{
char a[2005];
int cnt;
node* nxt;
node* pre;
node(){cnt=0;nxt=pre=NULL;}
void push_back(char x){
a[++cnt]=x;
}
void rebuild(){
node* ne=new node;
node* nn=nxt;
if (nn!=NULL)nn->pre=ne;
ne->nxt=nn;ne->pre=this,nxt=ne;
for (int i=1001;i<=cnt;i++)ne->push_back(a[i]);
cnt=1000;
}
int insert(int k,char x){
for (int i=cnt;i>=k;i--)a[i+1]=a[i];
a[k]=x;++cnt;
if (cnt>=2000){
rebuild();
return 1;
}
else return 0;
}
void del(int k){
for (int i=k;i<cnt;i++)a[i]=a[i+1];
--cnt;
}
}a;
struct pointer{
node* now;int id;
void move(int n){
if (n<0){
id+=n;
while (id<0){
now=now->pre;
id+=now->cnt;
}
return;
}
id+=n;
while (id>now->cnt){
id-=now->cnt;
now=now->nxt;
}
}
}p,xxx;
signed main(){
p.now=&a;p.id=0;
int Q;
cin>>Q;
while (Q--){
string s;cin>>s;
int t,x;
//cout<<s<<"\n";
switch(s[0]){
case 'I':
cin>>t;
x=t;
while (t--){
char x='\n';
while (x=='\n'||x=='\r')x=getchar();
int flag=p.now->insert(p.id+1,x);
if (flag){
p.now=p.now->nxt;p.id=1000;
}
else ++p.id;
}
p.move(-x);
break;
case 'M':
cin>>t;
p.now=&a;p.id=0;
p.move(t);
break;
case 'D':
cin>>t;
while (t--){
while (p.id==p.now->cnt){
p.now=p.now->nxt;p.id=0;
}
p.now->del(p.id+1);
}
break;
case 'G':
cin>>t;
xxx=p;
while (t--){
while (p.id==p.now->cnt){
p.now=p.now->nxt;p.id=0;
}
++p.id;
cout<<p.now->a[p.id];
}
cout<<"\n";
p=xxx;
break;
case 'P':
while (!p.id){
p.now=p.now->pre;p.id=p.now->cnt;
}
--p.id;
break;
case 'N':
while (p.id==p.now->cnt){
p.now=p.now->nxt;p.id=0;
}
++p.id;
break;
}
//cout<<p.id<<"\n";
}
return 0;
}