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;生产管理是企业的组…

android 对话框 图片,android – AlertDialog按钮的图像

由于不推荐使用onPrepareDialog,因此您可以使用onShowListener.你也应该设置Drawable边界,或者它将被放置在最左边.下面的代码输出public class MyDialog extends DialogFragment {Overridepublic Dialog onCreateDialog(Bundle savedInstanceState) {final AlertDialog dialog…

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

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

Windows 8.1 Windows Phone 开发环境安装遇到的问题

以前使用 Windows 8 开装 WP 8 的开发环境&#xff0c;很是顺利。 将系统升级到 Windows 8.1 后&#xff0c;先是安装了 Windows 8.1 旗舰本&#xff0c;安装后发现没有 Hyper-V 功能。 换成企业版&#xff0c;确定有 Hyper-V 功能后&#xff0c;安装 VS2010 WP8 SDK 后&#x…

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)中需要…

python数独代码_python 实现计算数独

输入文件格式&#xff1a;008309100900060004007504800036000540001000600042000970005907300600010008004608200输出结果&#xff1a;yuan********************0 0 8 3 0 9 1 0 09 0 0 0 6 0 0 0 40 0 7 5 0 4 8 0 00 3 6 0 0 0 5 4 00 0 1 0 0 0 6 0 00 4 2 0 0 0 9 7 00 0 5…

MyEclipse配色字体等配置的解决方案

Myeclipse黑色配色方案&#xff08;精心修改版&#xff09; http://download.csdn.net/detail/rehongchen/6579945 如何改变Myeclipse编辑区背景色 http://my.oschina.net/epiclight/blog/465506 -------------------------------------------------------------------------…

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

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

python pp模块_python常用模块

1、re模块re模块用于对python的正则表达式的操作1.1 什么是正则正则就是用一些具有特殊含义的符号组合到一起(称为正则表达式)来描述字符或者字符串的方法。或者说&#xff1a;正则就是用来描述一类事物的规则。(在Python中)它内嵌在Python中&#xff0c;并通过 re 模块实现。正…

[Leetcode]@python 90. Subsets II.py

题目链接 https://leetcode.com/problems/subsets-ii/ 题目原文 Given a collection of integers that might contain duplicates, nums, return all possible subsets. Note: Elements in a subset must be in non-descending order. The solution set must not contain dupli…

android glu,我可以使用glu与Android NDK

Does OpenGL ES not have glu?OpenGL ES 1.1&#xff1a;#include #include OpenGL ES 2.0&#xff1a;#include #include Is there a port I can use?是的&#xff0c;Android的部分端口为GLU – GLU ES(支持gluErrorString&#xff0c;gluPerspective和许多其他功能)&#…

线程间通信 GET POST

线程间通信有三种方法&#xff1a;NSThread GCD NSOperation 进程&#xff1a;操作系统里面每一个app就是一个进程、 一个进程里面可以包含多个线程&#xff0c;并且我们每一个app里面有且仅有一条主线程。scrollViewDelegate 的方法 &#xff1a; &#xff08;UIView *&…

android 恢复app 到前台,android手机把app disable了,怎么恢复

程序源代码如下:main(){int i,j,k;printf("\n");for(i1;i<5;i)    &#xff0f;*以下为三重循环*/for(j1;j<5;j)for (k1;k<5;k){if (i!k&&i!j&&j!k)    /*确保i、j、k三位互不相同*/printf("%d,%d,%d\n",i,j,k);}}main(){…

python mount回调函数_为python回调函数设置argtype

我对Python很在行&#xff0c;所以希望我能正确地表达这个问题。在整个问题涉及从Python调用C例程。我可以通过把一些相关的问题/答案凑在一起来接近&#xff0c;但我似乎不能把事情安排得很好。有两个方面&#xff1a;第一个是用指针调用C例程&#xff0c;第二个是使用回调函数…

参考 备份

原链接http://help.jd.com/Vender/question-1004.html 京东开放平台招商基础资质标准 一、基础资质标准&#xff1a; 注&#xff1a;商家可以选择京东质检平台中的第三方机构检测服务&#xff0c;申请地址&#xff1a;http://fw.jd.com/ser/list.action?page1&cid400 店铺…

android透明像素效率,android-非透明像素上的ImageView ColorFilter.夹

我有一个带位图的ImageView.该位图具有Alpha通道和透明像素.当我尝试将ColorFiter与Mode.OVERLAY(由于蜂窝)一起使用时-提供的颜色覆盖了整个imageview(整个矩形),但是我只想覆盖非透明像素.我如何裁剪imageview的画布以在需要的地方执行过滤器&#xff1f;更新我在png中有灰色…

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

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

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

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

python股票交易模型_如何用Python建模GGM模型并对股票估值?

内容首发乐学偶得(http://lexueoude.com) 公众号&#xff1a; 乐学Fintech用代码理解分析解决金融问题首先我们快速了解一下什么是GGM模型。GGM模型又叫做“戈登增长模型”(Gordon Growth Model&#xff0c;GGM)是用于对公司进行估值的工具。该理论假设公司的内在价值就是将所有…

android android 修改 jpg exif 属性,Android开发之使用ExifInterface获取拍照后的图片属性...

本文实例讲述了Android开发之使用ExifInterface获取拍照后的图片属性。分享给大家供大家参考&#xff0c;具体如下&#xff1a;ExifInterface exif new ExifInterface(file.getPath());String widthStr exif.getAttribute(ExifInterface.TAG_IMAGE_WIDTH);String heightStr …