bzoj1269 文本编辑器 splay

直接搞棵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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/430856.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

sap bom递归_SAP软件之化工行业特点01

作者&#xff1a;阿long声明&#xff1a;本文章仅用于SAP软件的应用、学习沟通&#xff0c;不代表SAP公司&#xff1b;文中所示截图来源SAP软件&#xff0c;相应著作权归SAP所有。SPA中关于制造的几种介绍2020.06.29简单的说&#xff0c;制造业中&#xff0c;生产管理是企业的组…

并发事务正确性的准则 可串行化_从0到1理解数据库事务(上):并发问题与隔离级别...

最近准备写一篇关于Spanner事务的分享&#xff0c;所以先分享一些基础知识&#xff0c;涉及ACID、隔离级别、MVCC、锁&#xff0c;由于太长&#xff0c;只好拆分成上下两篇&#xff1a;上&#xff1a;并发问题与隔离级别主要讲事务所要解决的问题、思路&#xff0c;先理解为什么…

android eclipse services,Eclipse中调试Android Framework本地代码模块部分过程记录

环境&#xff1a;Amlogic S905M2 ubunt12.04 win7 adt_bundle_linux Android SDK过程&#xff1a;1.为避免用Eclipse基础版本(Luna)后需要安装包括adt、cdt等插件麻烦&#xff0c;直接解压adt_bundle_linux安装IDE环境2.调试准备&#xff1a;目标设备(Amlogic S905M2)中需要…

android studio内置终端,Android Studio Terminal xx不是内部或者外部命令

背景在使用AS工具自带命令面板Terminal的时候&#xff0c;相信你有碰到过&#xff1a;xx不是内部或者外部命令&#xff0c;也不是可运行程序。解决办法就是配置环境变量一、在 Terminal 中使用 adb&#xff0c;报 adb 不是内部或者外部命令&#xff0c;也不是可运行的程序。解决…

svm预测结果为同一个值_SVM算法总结

一、1.感知机模型&#xff1a;感知器模型是SVM、神经网络、深度学习等算法的基础;感知器模型就是试图找到一条直线&#xff0c;能够把所有的“1”类和“-1”类分隔开&#xff0c;如果是高维空间中&#xff0c;感知器模型寻找的就是一个超平面&#xff0c;能够把所有的二元类别分…

iOS 动画绘制线条颜色渐变的折线图

效果图 .................... 概述 现状 折线图的应用比较广泛&#xff0c;为了增强用户体验&#xff0c;很多应用中都嵌入了折线图。折线图可以更加直观的表示数据的变化。网络上有很多绘制折线图的demo&#xff0c;有的也使用了动画&#xff0c;但是线条颜色渐变的折线图的…

android使碎片切换界面,玩转Android中的碎片Fragment

引言&#xff1a;在Android开发中&#xff0c;我们都知道一些界面的展示经常会用到的就是Activity,但是Activity存在着很大的局限性,比如说手机上的界面显示在平板上面就会发生各种变形的问题,Activity也无法实现局部的数据刷新,所以Android3.0之后出来了Fragment,Fragment通常…

html GPS坐标实现,JavaScript 实现GPS坐标点距离计算(两个经/纬度间的距离计算)...

在LBS(基于位置服务)的一些应用中&#xff0c;有时我们会需要计算两个用户或两个坐标点之间的距离。要解决这类问题&#xff0c;就要了解空间几何的概念并结合数学中在三角函数公式计算两点之间的值。本文介绍基于经度/纬度的&#xff0c;两个坐标点之间的距离计算&#xff0c;…

机器学习基于skcilearn tensorflow电子书_Tensorflow机器学习模型的跨平台上线

本篇文章转载自博客园&#xff0c;作者: 刘建平Pinard在用PMML实现机器学习模型的跨平台上线中&#xff0c;我们讨论了使用PMML文件来实现跨平台模型上线的方法&#xff0c;这个方法当然也适用于tensorflow生成的模型&#xff0c;但是由于tensorflow模型往往较大&#xff0c;使…

html5 observer api,基于HTML5新特性Mutation Observer实现编辑器的撤销和回退操作

MutationObserver介绍MutationObserver给开发者们提供了一种能在某个范围内的DOM树发生变化时作出适当反应的能力.该API设计用来替换掉在DOM3事件规范中引入的Mutation事件.Mutation Observer(变动观察器)是监视DOM变动的接口。当DOM对象树发生任何变动时&#xff0c;Mutation …

Maven(五)使用Nexus搭建Maven私服

文章装载于&#xff1a;http://blog.csdn.net/jun55xiu/article/details/39497089 Nexus介绍 Nexus是Maven仓库管理器&#xff0c;如果你使用Maven&#xff0c;你可以从Maven中央仓库下载所需要的构件&#xff08;artifact&#xff09;&#xff0c;但这通常不是一个好的做法&am…

计算机学测打多少字,速度测试,一分钟能打多少字?

六、速度测试——检验学习效果经过一段时间的练习&#xff0c;输入速度提高了不少吧&#xff0c;赶快来测试一下现在一分钟可以输入多少英文或汉字。金山打字通2010的“速度测试”功能不仅有基本的“屏幕对照”速度测试&#xff0c;还有“书本对照”测试及要求较高的“同声录入…

HDFS入门(1)

2015.07.12笔记 1.HDFS Distributed File System&#xff08;操作系统实现人机交互&#xff0c;最重要的功能是文件管理&#xff0c;使用文件管理系统&#xff0c;windows、Linux文件管理系统有共性&#xff1a;用户可创建文件/夹&#xff0c;删除&#xff0c;修改权限&#xf…

竞赛图 计算机网络 应用题,我校学子获2020年“中国高校计算机大赛-网络技术挑战赛”全国总决赛一等奖(图)...

近日&#xff0c;2020年“中国高校计算机大赛-网络技术挑战赛”全国总决赛在温州浙南科技城落下帷幕。我校计算机与信息安全学院陈俊彦、雷晓春老师指导的“智载车队”团队(成员&#xff1a;林楷浩、陈澳格、黄湖)在创业先锋C系列中获得全国一等奖&#xff0c;在创新创意A系列中…

建立远程桌面连接计算机无密码,win7远程桌面空密码的步骤_win7系统如何设置让远程桌面登录无需密码-win7之家...

在日常工作中&#xff0c;可能经常会使用到远程连接桌面功能&#xff0c;我们要远程桌面的话&#xff0c;通常是要输入密码才可以的&#xff0c;但是有些用户觉得麻烦&#xff0c;那么win7系统如何设置让远程桌面登录无需密码呢&#xff1f;带着大家的这个问题&#xff0c;本文…

tkinter如何lable重复显示到同一行中_如何创建包含 CAD 导入和选择的仿真 App

在使用 COMSOL 软件二次开发的过程中&#xff0c;你可能会遇到这样的问题&#xff1a;如何使用 App 开发器创建可以处理 CAD 导入并能让用户交互式选择边界条件的仿真 App&#xff1f;我需要了解编程吗&#xff1f;今天我们将为您介绍在 COMSOL 软件中创建包含 CAD 导入和选择的…

计算机科学导论课后单词,计算机科学导论课后总结

计算机科学导论课后总结1老师上课给我们演示了一个迷宫的程序&#xff0c;然后我上网查找了一下&#xff0c;大致学习了一下这个程序的思想。迷宫这个题目和数据结构—图有关迷宫的随机生成和路径搜索主要和图的遍历有关&#xff0c;一般来说图的遍历主要有两种方式&#xff1a…

表单内如何直接贴图而不用上传图片_表单如何添加图片?

表单其实就是我们平常经常看到的收集信息的框框&#xff0c;如姓名、电话等&#xff0c;当然易表单就远不止这些哦&#xff0c;还可制作调查问卷&#xff0c;报名登记、投票评选和考试测评。平时大家都擅长于制作表单的文字内容&#xff0c;实际上表单里边添加一些图片会让表单…

Android应用的安全的攻防之战

一、前言 在前两篇破解的文章中&#xff0c;我们介绍了如何使用动态调试来破解apk&#xff0c;一个是通过调试smali源码&#xff0c;一个是通过调试so代码来进行代码的跟踪破解&#xff0c;那么今天我们就这两篇文章的破解方法&#xff0c;来看看Android中开发应用的过程中如何…

标准正态分布表_表达矩阵的归一化和标准化,去除极端值,异常值

我们阅读量破万的综述&#xff1a;RNA-seq这十年(3万字长文综述)给粉丝朋友们带来了很多理解上的挑战&#xff0c;所以我们开辟专栏慢慢介绍其中的一些概念性的问题&#xff0c;上一期&#xff1a;RNA-seq的counts值&#xff0c;RPM, RPKM, FPKM, TPM 的异同在数据挖掘过程&…