【BZOJ1269】文本编辑器editor(AHOI2006)-NOI原题升级版

原创 2016年08月30日 20:56:58

题目:文本编辑器editor(AHOI2006)

做法:此题是由NOI2003的原题改编而来(原题我也写了博客,地址在此:NOI原题),就是多了一个翻转操作,以及提取时只用提取一个字符。用伸展树来维护当前编辑器中的文本,用一个数组p来存储标记,p[i]为真时表示以i为根节点的子树所代表的字符串需要翻转,注意处理标记的下放即可。

以下为本人代码:

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
#define M 1024*1024
using namespace std;
int t,rt=0,top=0,l=0,len,ch[2*M+10][2],pre[2*M+10],siz[2*M+10],p[2*M+10];
char op[20],in[2*M+10],val[2*M+10];
bool flag;

void newnode(int &x,char c,int f)
{
  x=++top;
  ch[x][0]=ch[x][1]=0;pre[x]=f;
  val[x]=c;siz[x]=1;p[x]=0;
}

void pushdown(int x) //标记下放
{
  if (p[x])
  {
    p[ch[x][0]]=!p[ch[x][0]];
	p[ch[x][1]]=!p[ch[x][1]];
	swap(ch[x][0],ch[x][1]);
	p[x]=0;
  }
}

void pushup(int x)
{
  siz[x]=siz[ch[x][0]]+siz[ch[x][1]]+1;
}

void buildtree(int &x,int l,int r,int f)
{
  if (l>r) return;
  int mid=(l+r)>>1;
  newnode(x,in[mid],f);
  pushdown(x);
  buildtree(ch[x][0],l,mid-1,x);
  buildtree(ch[x][1],mid+1,r,x);
  pushup(x);
}

void read(int len)
{
  int i=0;
  while(i<len)
  {
    scanf("%c",&in[i+1]);
	if (in[i+1]!='\n') i++;
  }
}

void rotate(int x,bool f)
{
  int y=pre[x];
  pushdown(y);pushdown(x);
  ch[y][!f]=ch[x][f];
  pre[ch[x][f]]=y;
  ch[x][f]=y;
  if (pre[y]) ch[pre[y]][ch[pre[y]][1]==y]=x;
  pre[x]=pre[y];pre[y]=x;
  pushup(y);
}

void Splay(int x,int goal)
{
  pushdown(x);
  while(pre[x]!=goal)
  {
    pushdown(pre[pre[x]]);pushdown(pre[x]);pushdown(x);
    if (pre[pre[x]]==goal) rotate(x,ch[pre[x]][0]==x);
	else
	{
	  int y=pre[x],z=pre[y];
	  bool f=(ch[z][1]==y);
	  if (ch[y][f]==x) rotate(y,!f),rotate(x,!f);
	  else rotate(x,f),rotate(x,!f);
	}
  }
  pushup(x);
  if (goal==0) rt=x;
}

void rotateto(int k,int goal)
{
  int x=rt;
  pushdown(x);
  while(siz[ch[x][0]]+1!=k)
  {
    if (siz[ch[x][0]]+1<k) {k-=siz[ch[x][0]]+1;x=ch[x][1];}
	else x=ch[x][0];
	pushdown(x);
  }
  Splay(x,goal);
}

void insert(int l,int len)
{
  rotateto(l+1,0);
  rotateto(l+2,rt);
  buildtree(ch[ch[rt][1]][0],1,len,ch[rt][1]);
  pushup(ch[rt][1]);pushup(rt);
}

void del(int l,int len)
{
  rotateto(l+1,0);
  rotateto(l+len+2,rt);
  ch[ch[rt][1]][0]=0;
  pushup(ch[rt][1]);pushup(rt);
}

void reverse(int l,int len) //翻转第l个字符后面的len个字符组成的字符串
{
  rotateto(l+1,0);
  rotateto(l+len+2,rt);
  p[ch[ch[rt][1]][0]]=!p[ch[ch[rt][1]][0]];
  pushup(ch[rt][1]);pushup(rt);
}

void getn(int l)
{
  rotateto(l+2,0);
  if (flag) printf("\n");
  else flag=1;
  printf("%c",val[rt]);
}

int main()
{
  scanf("%d",&t);
  ch[0][0]=ch[0][1]=pre[0]=siz[0]=flag=0;
  newnode(rt,'\n',0);
  newnode(ch[rt][1],'\n',rt);
  for(int i=1;i<=t;i++)
  {
    scanf("%s",op);
	if (op[0]=='P') l--;
	if (op[0]=='N') l++;
	if (op[0]=='M') scanf("%d",&l);
    if (op[0]=='I')
	{
	  scanf("%d",&len);
	  read(len);
	  insert(l,len);
	}
	if (op[0]=='D')
	{
	  scanf("%d",&len);
	  del(l,len);
	}	
	if (op[0]=='R')
	{
	  scanf("%d",&len);
	  reverse(l,len);
	}
	if (op[0]=='G') getn(l);
  }
  
  return 0;
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

BZOJ 1269 [AHOI2006]文本编辑器editor Splay伸展树

题目大意:类似于我们正常输入文本,现在模拟这样的一个功能。它支持: 1.将光标移动到第k个字符前 2.在光标后面加入长度为l的字符串 3.删除光标后面l个字符 4.将光标后面l个字符翻转 5...

【BZOJ 1269】 [AHOI2006]文本编辑器editor

splay操作的模板题。

bzoj1269【AHOI2006】文本编辑器editor

突然想起WC2014最后一晚gala night的you splay me up...2333

BZOJ1269——[AHOI2006]文本编辑器editor

1、题意:各种splay操作,一道好的模板题2333 2、分析:splay模板题,没啥解释QAQ #include #include #include #include #include...

【BZOJ1269】[AHOI2006]文本编辑器editor Splay

仍然是Splay模板题。让我们重写一下 1500 的主函数,然后jin'xing

bzoj 1269: [AHOI2006]文本编辑器editor (splay) [省选计划系列]

1269: [AHOI2006]文本编辑器editor Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 3655  Solved: 1367 [...

[bzoj1269][AHOI2006]文本编辑器editort

这道题跟noi2005的维护序列类似,而且要比它简单一点,故用splay的话,只要仔细认真即可,不是很难。 值得注意一点是在找前驱,后继等点时,不需要单独写一个过程,只要找出它们的位置(即它们是序列中...

[AHOI2006]文本编辑器editor (Splay tree)

转载请注明出处,谢谢 http://blog.csdn.net/ACM_cxlove?viewmode=contents           by---cxlove 通过一个变量记录光...

bzoj 1269 文本编辑器editor splay

题意:中问题。 思路:splay的基本操作,注意读入,详见代码: /********************************************************* file...

(九)C#之WinForm程序设计-升级版文本编辑器

C#WinForm程序设计之升级版文本编辑器 前面的那篇博文讲解了一个简单版本的文本编辑器,实现了一些最简单的功能。那么这里我们对那个文本编辑器做一个升级吧!既然是升级版,那么就要做的像Word一点咯...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)