记录编号 300973 评测结果 AAAAAAAAAA
题目名称 [NOI 2003]文本编辑器 最终得分 100
用户昵称 GravatarFoolMike 是否通过 通过
代码语言 C++ 运行时间 1.043 s
提交时间 2016-08-29 16:52:06 内存使用 60.37 MiB
显示代码纯文本
#include<cstdio>
#include<cstring>
const int N=3000010;
int t,l,q[N];bool m[N];
char ch[N],S[N],a[N];
struct Splay{
	char ch[N];
	int l[N],r[N],s[N],root,top,_x;
	Splay(){
		memset(l,0,sizeof l);
		memset(r,0,sizeof r);
		memset(ch,0,sizeof ch);
		memset(s,0,sizeof s);
		_x=root=1;top=r[1]=s[1]=2;s[2]=1;
	}
	inline void update(int x){
		s[x]=s[l[x]]+s[r[x]]+1;
	}
	inline void l_rotate(int &x){
		int y=r[x];
		r[x]=l[y];l[y]=x;
		update(y);update(x);
		x=y;
	}
	inline void r_rotate(int &x){
		int y=l[x];
		l[x]=r[y];r[y]=x;
		update(y);update(x);
		x=y;
	}
	void splay(int &x,int pos){
		int i=s[l[x]]+1;
		if (i==pos) return;
		if (i<pos) splay(r[x],pos-i),l_rotate(x);
			else splay(l[x],pos),r_rotate(x);
	}
	int build(int L,int R){
		if (L>R) return 0;
		int mid=(L+R)/2,now=++top;
		ch[now]=S[mid];s[now]=R-L+1;
		l[now]=build(L,mid-1);
		r[now]=build(mid+1,R);
		return now;
	}
	inline void insert(int len){
		splay(root,_x);
		splay(root,_x+1);
		for (int i=1;i<=len;i++)
		for (S[i]=0;S[i]<32||S[i]>126;S[i]=getchar());
		r[l[root]]=build(1,len);
		update(l[root]);
		update(root);
	}
	inline void del(int len){
		splay(root,_x);
		splay(root,_x+len+1);
		r[l[root]]=0;
		update(l[root]);
		update(root);
	}
	inline void move(int pos){_x=pos+1;}
	inline void next(){_x++;}
	inline void prev(){_x--;}
	inline void get(int len){
		splay(root,_x);
		splay(root,_x+len+1);
		print(r[l[root]]);
		puts("");
	}
	void print(int x){
		if (l[x]) print(l[x]);
		putchar(ch[x]);
		if (r[x]) print(r[x]);
	}
}T;
int main()
{
	freopen("editor2003.in","r",stdin);
	freopen("editor2003.out","w",stdout);
	scanf("%d",&t);
	while (t--){
		scanf("%s",ch);
		if (ch[0]!='P'&&ch[0]!='N') scanf("%d",&l);
		gets(a);
		if (ch[0]=='I') T.insert(l);
		if (ch[0]=='D') T.del(l);
		if (ch[0]=='G') T.get(l);
		if (ch[0]=='M') T.move(l);
		if (ch[0]=='P') T.prev();
		if (ch[0]=='N') T.next();
	}
	return 0;
}