直接搞棵splay就行了,不要把光标弄到树中而是把光标当成询问或操作区间的端点标志这样会简单很多。

7点40分写到9点20分,包括调试总共花了一个小时40分钟,这次是自己独立调出来的,总算对splay有一定的了解。

设计操作:区间翻转,区间删除和插入,取第k个数。

这里的区间插入不是一个一个插,那样会很容易使树退化成链状,这里应该直接在key_val中build。

#include<bits/stdc++.h>
#define REP(i,a,b) for(int i=a;i<=b;i++)
#define MS0(a) memset(a,0,sizeof(a))
#define key_val ch[ch[rt][1]][0]using namespace std;typedef long long ll;
const int INF=1e9+10;
const int maxn=2000100;int N;
char op[20];int k;
char str[maxn];
int pos;int pre[maxn],sz[maxn],ch[maxn][2],rt,tot1;
int s[maxn],tot2;
char val[maxn];
int rev[maxn];void debug(int r)
{if(r==0) return;debug(ch[r][0]);printf("%c",val[r]);//printf("lch=%2d rch=%2d pre=%2d r=%2d val=%c sz=%2d rt=%2d\n",ch[r][0],ch[r][1],pre[r],r,val[r],sz[r],rt);debug(ch[r][1]);
}void up(int r)
{sz[r]=sz[ch[r][0]]+sz[ch[r][1]]+1;
}void update_rev(int r)
{if(!r) return;swap(ch[r][0],ch[r][1]);rev[r]^=1;
}void down(int r)
{if(rev[r]){update_rev(ch[r][0]);update_rev(ch[r][1]);rev[r]=0;}
}void newnode(int &r,int fa,char k)
{if(tot2) r=s[tot2--];else r=++tot1;pre[r]=fa;val[r]=k;sz[r]=1;rev[r]=0;MS0(ch[r]);
}void rot(int x,int kind)
{int y=pre[x];down(y);down(x);ch[y][kind^1]=ch[x][kind];pre[ch[x][kind]]=y;if(pre[y]) ch[pre[y]][ch[pre[y]][1]==y]=x;pre[x]=pre[y];ch[x][kind]=y;pre[y]=x;up(y);
}void splay(int x,int goal)
{down(x);while(pre[x]!=goal){if(pre[pre[x]]==goal) rot(x,ch[pre[x]][0]==x);else{int y=pre[x],z=pre[y];int kind=ch[y][0]==x,one=0;if(ch[y][0]==x&&ch[z][0]==y) one=1;if(ch[y][1]==x&&ch[z][1]==y) one=1;if(one) rot(y,kind),rot(x,kind);else rot(x,kind),rot(x,kind^1);}}if(goal==0) rt=x;up(x);
}void rto(int k,int goal)
{int r=rt;k++;while(k!=sz[ch[r][0]]+1){down(r);if(k<sz[ch[r][0]]+1) r=ch[r][0];else k-=sz[ch[r][0]]+1,r=ch[r][1];}splay(r,goal);
}void Rev(int l,int r)
{rto(l-1,0);rto(r+1,rt);down(rt);down(ch[rt][1]);update_rev(key_val);up(ch[rt][1]);up(rt);
}void Del(int l,int r)
{rto(l-1,0);rto(r+1,rt);down(rt);down(ch[rt][1]);key_val=0;up(ch[rt][1]);up(rt);
}void build(int &x,int l,int r,int fa)
{if(l>r) return;int m=(l+r)>>1;//cout<<"l="<<l<<" r="<<r<<" m="<<m<<" str="<<str<<endl;
    newnode(x,fa,str[m]);build(ch[x][0],l,m-1,x);build(ch[x][1],m+1,r,x);up(x);
}void Insert()
{rto(pos,0);rto(pos+1,rt);down(rt);down(ch[rt][1]);int n=strlen(str);build(key_val,0,n-1,ch[rt][1]);pre[key_val]=ch[rt][1];up(ch[rt][1]);up(rt);
}char Get(int k)
{int r=rt;k++;while(k!=sz[ch[r][0]]+1){down(r);if(k<sz[ch[r][0]]+1) r=ch[r][0];else k-=sz[ch[r][0]]+1,r=ch[r][1];}return val[r];
}void Init()
{pre[0]=sz[0]=ch[0][0]=ch[0][1]=rev[0]=0;rt=tot1=tot2=0;newnode(rt,0,'-');newnode(ch[rt][1],rt,'+');sz[rt]=2;
}int main()
{freopen("in.txt","r",stdin);while(cin>>N){Init();pos=0;REP(i,1,N){scanf("%s",op);if(op[0]=='I'){scanf("%d",&k);gets(str);gets(str);Insert();}else if(op[0]=='M'){scanf("%d",&k);pos=k;}else if(op[0]=='D'){scanf("%d",&k);Del(pos+1,pos+k);}else if(op[0]=='R'){scanf("%d",&k);Rev(pos+1,pos+k);}else if(op[0]=='G') printf("%c\n",Get(pos+1));else if(op[0]=='P') pos--;else pos++;}}return 0;
}

View Code

转载于:https://www.cnblogs.com/--560/p/5202694.html

bzoj1269 文本编辑器 splay相关推荐

  1. Bzoj1269 [AHOI2006]文本编辑器editor

    Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 3678  Solved: 1380 Description 这些日子,可可不和卡卡一起玩了,原来可可 ...

  2. BZOJ 1269: [AHOI2006]文本编辑器editor Splay

    F.A.Qs Web Board Home ProblemSet Status Ranklist Contest ModifyUser   yejinru(0) Logout 捐赠本站 Notice: ...

  3. 1269: [AHOI2006]文本编辑器editor

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

  4. Django 第三方引用富文本编辑器6.1

    借助富文本编辑器,管理员能够编辑出来一个包含html的页面,从而页面的显示效果,可以由管理员定义,而不用完全依赖于前期开发人员 此处以tinymce为例,其它富文本编辑器的使用可以自行学习 使用编辑器 ...

  5. .net下的富文本编辑器FCKeditor的配置方法(图)原创

    .net下的富文本编辑器FCKeditor的配置方法(图)原创 FCKeditor是一款开源的富文本编辑器,几乎支持所有流行的Web开发语言,版本稳定,用户多,可配置性好. 以前做Java和php的时 ...

  6. ASP.NET2.0 文本编辑器FCKeditor的冰冷之心 【月儿原创】

    ASP.NET2.0 文本编辑器FCKeditor的冰冷之心 作者:清清月儿 主页:http://blog.csdn.net/21aspnet/           时间:2007.4.9 FCKed ...

  7. sql文本编辑器_专业文本编辑工具

    Mac上好用的文本编辑器是哪个?TextMate for Mac是一款多功能的纯文本编辑器,支持所有主要的编程语言,是一款操作简单又实用的编辑工具,macdown提供TextMate Mac版软件下载 ...

  8. c# html文本编辑器,C#实现简单文本编辑器

    本文实例为大家分享了C#实现简单文本编辑器的具体代码,供大家参考,具体内容如下 建立一个窗体文件,实现对文件的编辑保存和对txt文件的打开 界面设计: 程序源代码: //form1.cs using ...

  9. ckedit 文本编辑器

    Ckeditor是一个功能非常强大的富文本编辑器,博客园有使用此编辑器,其功能完全可以与MS的Word媲美. 用起来也非常方便.下面是本人总结的安装步骤: 第一步,从http://ckeditor.c ...

最新文章

  1. 《精通Nginx》——2.3 使用include文件
  2. aop 获取注解注释的方法_带有AOP和注释的Java方法记录
  3. 计算机模拟量与数字量的转换,在S7-1200 CPU中,如何实现模拟量数值与工程量数值之间的转换?...
  4. django前端到后端一次简单完整的请求实例
  5. 前端:JS/26/实例:随机显示小星星
  6. java的前台与后台
  7. 万物皆可python_Python知识点合集,学完万物皆可爬
  8. 台式计算机组装注意事项,如何组装台式机 组装台式机配置注意事项【详解】...
  9. “2020 博客之星”年度总评选 TOP 200 名单已出,速来认领!
  10. 分析评估和定位声音质量
  11. 软件测试与质量保证-测试一
  12. 公网SSH远程连接Ubuntu【免费内网穿透】
  13. 手机内存卡丢失数据怎么恢复
  14. Nvidia Isaac Sim ROS机器人仿真和AMR开发环境
  15. 智能语音助手调研【简单可行方案及开源代码】
  16. android layout 界面开发,android 界面布局入门级示例(LinearLayout)
  17. 微信小程序存储(数据缓存,存储和取值)
  18. 信息安全等级保护等级划分
  19. idea将指定目录打成jar包
  20. 群晖218和218+区别_希捷企业级硬盘和希捷酷狼硬盘有什么区别

热门文章

  1. javascript网页特效_南通建网站哪些,网页设计维护
  2. 日志汇总:logging、logger
  3. 基本语法和数组(二维,多维,交错数组)
  4. 一道算法题跟大家分享
  5. PMP读书笔记(第4章)
  6. 分享一个有趣的网站“让我帮你百度一下“
  7. hapi 使用 lab 和 code 进行测试
  8. mysql master host_mysql异步备份的有关问题,MASTER_HOST可否指定多个
  9. java 建立ssh隧道_SSH基础
  10. Php的https方法,php获取https协议内容的两种方法