求调qwq
查看原帖
求调qwq
763878
Jerry_heng楼主2024/1/23 18:35

找第一篇tj打的。

#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,len-tot,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),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;
}
2024/1/23 18:35
加载中...