【BZOJ1507】【NOI2003】Editor
【BZOJ3932】【CQOI2015】任务查询系统

【BZOJ1269】【AHOI2006】文本编辑器editor

Zarxdy34 posted @ 2016年3月13日 19:37 in BZOJ with tags Splay rope , 716 阅读

  和BZOJ1507差不多的题目,就是增加了一个Rotate操作,改改就好了。

 

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn=3000010;

struct Splay_Tree
{
	struct Node
	{
		Node *c[2],*p;
		char v;
		int tag_rev;
		int size;
		int w() {return this==p->c[1];}
	}MEM[maxn],*Null,*root;
	int IDs;

	#define ls x->c[0]
	#define rs x->c[1]

	Node* NewNode()
	{
		Node *x=&MEM[IDs++];
		ls=rs=x->p=Null;
		x->v=0;x->size=1;
		return x;
	}

	Splay_Tree()
	{
		Null=&MEM[0];
		Null->v=Null->size=0;
		Null->c[0]=Null->c[1]=Null->p=Null;
		IDs=1;
		Node *LeftNull=NewNode();
		Node *RightNull=NewNode();
		root=LeftNull;
		root->c[1]=RightNull;RightNull->p=root;root->size=2;
	}

	void Update(Node *x) {if (x==Null) return;x->size=ls->size+rs->size+1;}

	void Mark_Rev(Node *x) {swap(ls,rs);x->tag_rev^=1;}

	void Push_Down(Node *x)
	{
		if (x==Null) return;
		if (x->tag_rev)
		{
			Mark_Rev(ls);
			Mark_Rev(rs);
			x->tag_rev=0;
		}
	}

	void Rotate(Node *x)
	{
		Node *p=x->p;
		int w=x->w();
		Push_Down(p);Push_Down(x);
		if (p==root) root=x;
		x->p=p->p;p->p->c[p->w()]=x;
		x->c[!w]->p=p;p->c[w]=x->c[!w];
		x->c[!w]=p;p->p=x;
		Update(p);
	}

	void Splay(Node *x,Node *top)
	{
		if (x==Null) return;
		Push_Down(x);
		while (x->p!=top)
		{
			if (x->p->p==top) {Rotate(x);break;}
			if (x->w()==x->p->w()) Rotate(x->p),Rotate(x);
			else Rotate(x),Rotate(x);
		}
		Update(x);
	}

	Node* Select(int k)
	{
		Node *x=root;
		while (k)
		{
			Push_Down(x);
			int lsz=ls->size;
			if (lsz+1==k) return x;
			else if (lsz>=k) x=ls;
			else k-=lsz+1,x=rs;
		}
	}

	Node* Build_Tree(int l,int r,char *ch)
	{
		Node *x=NewNode();
		if (l==r) {x->v=ch[l];return x;}
		int mid=(l+r)>>1;
		x->v=ch[mid];
		if (l<mid) ls=Build_Tree(l,mid-1,ch);
		if (mid<r) rs=Build_Tree(mid+1,r,ch);
		ls->p=rs->p=x;
		Update(x);
		return x;
	}

	Node* Get_Seq(int l,int r)
	{
		Splay(Select(l-1),Null);
		Splay(Select(r+1),root);
		return root->c[1]->c[0];
	}

	void Print(Node *x)
	{
		if (x==Null) return;
		Print(ls);
		putchar(x->v);
		Print(rs);
	}
	
	void Insert(int pos,int n,char *ch)
	{
		Node *NewRoot=Build_Tree(1,n,ch);
		Splay(Select(pos),Null);
		Splay(Select(pos+1),root);
		root->c[1]->c[0]=NewRoot;
		NewRoot->p=root->c[1];
		Splay(NewRoot,Null);
	}
	
	void Delete(int pos,int n)
	{
		Node *x=Get_Seq(pos+1,pos+n);
		x->p->c[x->w()]=Null;
		Update(x->p);
		Splay(x->p,Null);
	}
	
	void Rotate(int pos,int n)
	{
		Node *x=Get_Seq(pos+1,pos+n);
		Mark_Rev(x);
		Splay(x,Null);
	}

	void Print(int pos,int n)
	{
		Node *x=Get_Seq(pos+1,pos+n);
		Print(x);
		Splay(x,Null);
	}
}T;

char readchar() {char ch;while ((ch=getchar())<32 || ch>126 || ch=='\n');return ch;}

char inst[maxn];

int main()
{
	int TT,pos=0,n;
	scanf("%d",&TT);
	while (TT--)
	{
		char ctr[10];
		scanf("%s",ctr);
		if (ctr[0]=='M') scanf("%d",&n),pos=n;
		else if (ctr[0]=='I')
		{
			scanf("%d",&n);
			for (int i=1;i<=n;i++) inst[i]=readchar();
			T.Insert(pos+1,n,inst);
		}
		else if (ctr[0]=='D') scanf("%d",&n),T.Delete(pos+1,n);
		else if (ctr[0]=='G') n=1,T.Print(pos+1,n),putchar('\n');
		else if (ctr[0]=='P') pos--;
		else if (ctr[0]=='N') pos++;
		else if (ctr[0]=='R') scanf("%d",&n),T.Rotate(pos+1,n);
	}
	return 0;
}

 

  然后还是可以用rope写的,维护两个rope,一个正向一个反向,旋转的时候只要交换那部分子串就好了。

 

#include <cstdio>
#include <ext/rope>
using namespace std;
using namespace __gnu_cxx;
const int maxn=3000010;

char readchar() {char ch;while ((ch=getchar())<32 || ch>126 || ch=='\n');return ch;}

char ch[maxn],ct[maxn];
char ctr[20];
crope a,b,temp;

int main()
{
	freopen("test.in","r",stdin);
	int T;
	scanf("%d",&T);
	int pos=0,n,len=0;
	while (T--)
	{
		scanf("%s",ctr);
		if (ctr[0]=='M') scanf("%d",&n),pos=n;
		else if (ctr[0]=='I')
		{
			scanf("%d",&n);
			for (int i=0;i<n;i++) ch[i]=readchar();
			for (int i=0;i<n;i++) ct[i]=ch[n-i-1];
			ch[n]=0;
			ct[n]=0;
			a.insert(pos,ch);
			b.insert(len-pos,ct);
			len+=n;
		}
		else if (ctr[0]=='P') pos--;
		else if (ctr[0]=='N') pos++;
		else if (ctr[0]=='D') scanf("%d",&n),a.erase(pos,n),b.erase(len-pos-n,n),len-=n;
		else if (ctr[0]=='G') n=1,a.copy(pos,n,ch),ch[n]=0,printf("%s\n",ch); 
		else if (ctr[0]=='R')
		{
			scanf("%d",&n);
			temp=a.substr(pos,n);
			a=a.substr(0,pos)+b.substr(len-pos-n,n)+a.substr(pos+n,len-(pos+n));
			b=b.substr(0,len-(pos+n))+temp+b.substr(len-pos,pos);
		}
	}
	return 0;
}
Avatar_small
essay代写 说:
2024年1月12日 14:23

EssayGhostWriting是为留学生提供量身定制Essay代写服务的全球在线平台。我们的Essay代写服务是专门为了缓解海外留学生的课业压力而成立的。任何学术问题同学们都可以联系我们,我们将以最优质的服务,最高标准的质量为您完成essay 和paper写作,或者数理学科、工科、社会人文学科等等各种类型的作业,保障作业质量和作业完成效率,让您的留学生活没有作业方面的后顾之忧。


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter