题目:洛谷P4008、BZOJ1507。

题目大意:
一堆操作。
1. 光标移动到指定位置
2. 在光标后插入一串字符
3. 在光标后删除一串字符
4. 光标前移
5. 光标后移
6. 输出光标后的一串字符
解题思路:
非旋Treap即可,插入时一个一个字符插也没什么问题,开O2就可以过(BZOJ过不去)。

C++ Code:

#include<bits/stdc++.h>
int t,rt=0,cnt=0,n,gb;
struct node{int r,ls,rs,sz;char s;
}a[5000005];
char opt;
inline void update(int x){a[x].sz=a[a[x].ls].sz+a[a[x].rs].sz+1;}
int merge(int x,int y){if(!x||!y)return x+y;if(a[x].r<a[y].r){a[x].rs=merge(a[x].rs,y);update(x);return x;}else{a[y].ls=merge(x,a[y].ls);update(y);return y;}
}
void split(int u,int k,int& x,int& y){if(k==0){x=0,y=u;return;}if(a[u].sz==k){x=u,y=0;return;}if(a[a[u].ls].sz>=k)split(a[u].ls,k,x,a[u].ls),y=u;elsesplit(a[u].rs,k-a[a[u].ls].sz-1,a[u].rs,y),x=u;update(u);
}
void print(int now){if(!now)return;print(a[now].ls);putchar(a[now].s);print(a[now].rs);
}
inline int readint(){int c=getchar(),d=0;for(;!isdigit(c);c=getchar());for(;isdigit(c);c=getchar())d=(d<<3)+(d<<1)+(c^'0');return d;
}
int main(){srand(20170607);memset(a,0,sizeof a);gb=0;for(t=readint();t--;){opt=getchar();for(;!isalpha(opt);opt=getchar());if(opt=='I'){n=readint();int oldgb=gb;while(n--){char c=getchar();while(c<32||c>126)c=getchar();a[++cnt]=(node){rand(),0,0,1,c};int x,y;split(rt,gb++,x,y);rt=merge(merge(x,cnt),y);}gb=oldgb;}elseif(opt=='D'){n=readint();int x,y,z;split(rt,gb,x,y);split(y,n,y,z);rt=merge(x,z);}elseif(opt=='M')gb=readint();elseif(opt=='P')--gb,getchar(),getchar(),getchar();elseif(opt=='N')++gb,getchar(),getchar(),getchar();else{n=readint();int x,y,z;split(rt,gb,x,y);split(y,n,y,z);print(y);putchar('\n');rt=merge(merge(x,y),z);}//print(rt);}return 0;
}

以下为笛卡尔树建树版本,跑的快了不止一点点,能在BZOJ上过了。

C++ Code:

#include<bits/stdc++.h>
int t,rt=0,cnt=0,n,gb,top=0,sta[5000005];
struct node{int r,ls,rs,sz;char s;
}a[5000005];
char opt,s[5000005];
inline void update(int x){a[x].sz=a[a[x].ls].sz+a[a[x].rs].sz+1;}
int merge(int x,int y){if(!x||!y)return x+y;if(a[x].r<a[y].r){a[x].rs=merge(a[x].rs,y);update(x);return x;}else{a[y].ls=merge(x,a[y].ls);update(y);return y;}
}
void split(int u,int k,int& x,int& y){if(k==0){x=0,y=u;return;}if(a[u].sz==k){x=u,y=0;return;}if(a[a[u].ls].sz>=k)split(a[u].ls,k,x,a[u].ls),y=u;elsesplit(a[u].rs,k-a[a[u].ls].sz-1,a[u].rs,y),x=u;update(u);
}
void print(int now){if(!now)return;print(a[now].ls);putchar(a[now].s);print(a[now].rs);
}
inline int readint(){int c=getchar(),d=0;for(;!isdigit(c);c=getchar());for(;isdigit(c);c=getchar())d=(d<<3)+(d<<1)+(c^'0');return d;
}
int build(int n){int x,pre;for(int i=1;i<=n;++i){a[x=++cnt]=(node){rand(),0,0,1,s[i]};for(pre=0;top&&a[sta[top]].r>a[x].r;--top)update(pre=sta[top]);if(top)a[sta[top]].rs=x;a[sta[++top]=x].ls=pre;}while(top)update(sta[top--]);return sta[1];
}
int main(){srand(20170607);memset(a,0,sizeof a);gb=0;for(t=readint();t--;){opt=getchar();for(;!isalpha(opt);opt=getchar());if(opt=='I'){n=readint();for(int i=1;i<=n;++i){char c=getchar();while(c<32||c>126)c=getchar();s[i]=c;}int x=build(n),y,z;split(rt,gb,y,z);rt=merge(merge(y,x),z);}elseif(opt=='D'){n=readint();int x,y,z;split(rt,gb,x,y);split(y,n,y,z);rt=merge(x,z);}elseif(opt=='M')gb=readint();elseif(opt=='P')--gb,getchar(),getchar(),getchar();elseif(opt=='N')++gb,getchar(),getchar(),getchar();else{n=readint();int x,y,z;split(rt,gb,x,y);split(y,n,y,z);print(y);putchar('\n');rt=merge(merge(x,y),z);}//print(rt);}return 0;
}

转载于:https://www.cnblogs.com/Mrsrz/p/8820004.html

[NOI2003]文本编辑器相关推荐

  1. [NOI2003] 文本编辑器

    洛谷题目链接:[NOI2003]文本编辑器 题目描述 很久很久以前, DOS3.xDOS3.xDOS3.x 的程序员们开始对 EDLINEDLINEDLIN 感到厌倦.于是,人们开始纷纷改用自己写的文 ...

  2. NOI2003文本编辑器

    problem 传送门 Solution 块状链表板子题-- 码了一下午,调了一晚上,代码重构了3遍,在终于过了. 还是太菜了. 移动光标的操作直接模拟即可. 插入操作,先将光标所在块分裂成两块,然后 ...

  3. 富文本编辑器中空格转化为a_文本编辑器题解

    文本编辑器-题解 内存限制: 256 Mb时间限制: 1000 ms 题目背景 文本编辑器是一种常见的软件,开发高效的文本编辑器是一件相当困难的事情.解决本题需求的数据结构被称为 Gap buffer ...

  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 ...

  10. linux如何编译tex,Linux下优秀的文本编辑器(Markdown、LaTeX、MathJax)

    这样一个标题可能不太准确,因为确实无法准确地解释什么叫"Linux下优秀的文本编辑器".其实我这篇随笔主要是想探讨Markdown.LaTeX.MathJax,有兴趣的朋友可以继续 ...

最新文章

  1. 机器学习中的数学基础(4.1):支持向量机Support Vector Machine(SVM)
  2. rowspan 动态变化_使用colspan和rowspan动态删除html表中的多个列
  3. ip登录打印机怎么打印_不要打印,登录。
  4. java异常处理 ppt_Java异常处理、多线程ppt课件
  5. spring :cannot be resolved to absolute file path because it does not reside in the file system: jar
  6. Ionic3学习笔记(二)主题化
  7. MCGS触摸屏通过MODBUS通讯速度控制台达B2伺服参数
  8. uploader.php,使用uploader上传拍摄的图片php后端代码出错~求助~
  9. Linux后台运行程序
  10. element中table表格和已选数据联动
  11. TN、IPS、VA面板区别
  12. 模具设计的四个步骤总结
  13. 面向物流行业的文档管理系统
  14. Oracle 11g RAC 修改服务器各类ip地址【转载】
  15. linux 添加动态链接库的方法
  16. 限流与代理网关集成调研及应用
  17. 快消品行业S2B2C电子商务网站提升供应链效率,加速行业整合
  18. VUE 项目中引入外部js文件(CND引入)
  19. win7需要计算机管理员权限,关于告诉你win7系统提示“需要管理员权限”的修复办法...
  20. BTTCOJ 问题 G: 逃离地牢 树形动规

热门文章

  1. PyQt5简单的例子
  2. 成功解决./nvidia-installer: invalid option: “‐‐no‐opengl‐files“ ERROR: Invalid commandline, please run `
  3. PyTorch载入图片ToTensor,PIL和OpenCV读取图片plt.imread和PIL.Image.open
  4. python迭代器学习与简单的实践
  5. python pickle模块详解
  6. vs C4996的错误解决方法
  7. oracle flex asm ceph,ORACLE 12C Flex ASM转换
  8. word 文字超出表格边框怎么办
  9. Kubernetes 小白学习笔记(4)--kubernetes是什么
  10. Java数据类型从小到大排序_编写一个字符串排序程序,对一个字符串的数值进行从小到大的排序,要求使用包装类对数值类型的字符串转换成整型进行排序...