BZOJ_1269&&1507_[AHOI2006]文本编辑器editor&&[NOI2003]Editor

题意:

分析:

splay模拟即可

注意1507的读入格式,最好用getchar

代码:

1269:

#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
#define N 2097200
#define ls ch[p][0]
#define rs ch[p][1]
#define get(x) (ch[f[x]][1]==x)
int ch[N][2],f[N],siz[N],val[N],sz;
int S[N],top,tot,pos,turn[N],rt,n;
char opt[20],a[N];
void clear(int p){ ch[p][0]=ch[p][1]=f[p]=turn[p]=siz[p]=val[p]=0; }
int newnode(int v)
{
int p;
if(top)p=S[--top];
else p=++tot;
clear(p);
val[p]=v;siz[p]=1;
return p;
}
void pushup(int p){ if(p) siz[p]=siz[ls]+siz[rs]+1; }
void pushdown(int p)
{
if(turn[p])
{
turn[p]=0;turn[ls]^=1;turn[rs]^=1;
if(ls) swap(ch[ls][0],ch[ls][1]);
if(rs) swap(ch[rs][0],ch[rs][1]);
}
}
void rotate(int x)
{
int y=f[x],z=f[y],k=get(x);
ch[y][k]=ch[x][k^1];f[ch[y][k]]=y;ch[x][k^1]=y;
f[y]=x;f[x]=z;if(z) ch[z][ch[z][1]==y]=x;
pushup(y);pushup(x);if(rt==y)rt=x;
}
void splay(int x,int y){ for(int fa;(fa=f[x])!=y;rotate(x))if(f[fa]!=y)rotate((get(x)==get(fa))?fa:x); }
int find(int x)
{
int p=rt;
while(1) {
pushdown(p);
if(x<=siz[ls])p=ls;
else {
x-=siz[ls]+1;
if(!x)return p;
p=rs;
}
}
}
void rec(int p)
{
if(!p)return ;
if(ls)rec(ls);ls=0;
if(rs)rec(rs);rs=0;
clear(p);
S[top++]=p;
}
void build_merge(int fa,int l,int r,bool flg)
{
if(l>r)return ;
int mid=l+r>>1,p=newnode(a[mid]);
ch[fa][flg]=p;
f[p]=fa;
build_merge(p,l,mid-1,0);build_merge(p,mid+1,r,1);
pushup(p);
}
void insert(int x,int cnt)
{
int i;
char w;
/*for(i=1;i<=cnt;)
{
w=getchar();
if(w=='\r'||w=='\n')continue;
a[i++]=w;
}*/
gets(a+1);
//printf("%s\n",a+1);
int p=x+1;
x=find(x);p=find(p);splay(x,0);splay(p,rt);
build_merge(p,1,cnt,0);
pushup(p);pushup(x);
}
void del(int x,int p)
{
x=find(x);p=find(p);
splay(x,0);splay(p,rt);
rec(ls);
ls=0;
pushup(p);pushup(x);
}
void reverse(int x,int p)
{
x=find(x);p=find(p);
splay(x,0);splay(p,rt);
turn[ls]^=1;swap(ch[ls][0],ch[ls][1]);
pushup(p);pushup(x);
}
void print()
{
printf("sz = %d\n",sz);
for(int i=1;i<=sz;i++)printf("%c\n",val[find(i)]);
}
int main()
{
scanf("%d",&n);
tot=sz=2;
ch[1][1]=2;
f[2]=1;
siz[1]=2;siz[2]=1;
rt=1;
pos++;
int i,x,y;
for(int i=1;i<=n;i++)
{
scanf("%s",opt);
if(opt[0]=='M'){
scanf("%d",&x);
pos=x+1;
}else if(opt[0]=='I'){
scanf("%d%*c",&x);
insert(pos,x);sz+=x;
//print();
}else if(opt[0]=='D'){
scanf("%d",&x);
del(pos,pos+x+1);sz-=x;
//print();
}else if(opt[0]=='R'){
scanf("%d",&x);
reverse(pos,pos+x+1);
//reverse(12,17);
//print();
}else if(opt[0]=='G'){
x=find(pos+1);
splay(x,0);
printf("%c\n",val[x]);
}else if(opt[0]=='P'){
pos--;
}else{
pos++;
}
}
}

1507:

#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
#define N 2097200
#define ls ch[p][0]
#define rs ch[p][1]
#define get(x) (ch[f[x]][1]==x)
int ch[N][2],f[N],siz[N],val[N],sz;
int S[N],top,tot,pos,rt,n;
char opt[20],a[N];
void clear(int p){ ch[p][0]=ch[p][1]=f[p]=siz[p]=val[p]=0; }
int newnode(int v)
{
int p;
if(top)p=S[--top];
else p=++tot;
clear(p);
val[p]=v;siz[p]=1;
return p;
}
void pushup(int p){ if(p) siz[p]=siz[ls]+siz[rs]+1; }
void rotate(int x)
{
int y=f[x],z=f[y],k=get(x);
ch[y][k]=ch[x][k^1];f[ch[y][k]]=y;ch[x][k^1]=y;
f[y]=x;f[x]=z;if(z) ch[z][ch[z][1]==y]=x;
pushup(y);pushup(x);if(rt==y)rt=x;
}
void splay(int x,int y){ for(int fa;(fa=f[x])!=y;rotate(x))if(f[fa]!=y)rotate((get(x)==get(fa))?fa:x); }
int find(int x)
{
int p=rt;
while(1) {
if(x<=siz[ls])p=ls;
else {
x-=siz[ls]+1;
if(!x)return p;
p=rs;
}
}
}
void rec(int p)
{
if(!p)return ;
if(ls)rec(ls);ls=0;
if(rs)rec(rs);rs=0;
clear(p);
S[top++]=p;
}
void build_merge(int fa,int l,int r,bool flg)
{
if(l>r)return ;
int mid=l+r>>1,p=newnode(a[mid]);
ch[fa][flg]=p;
f[p]=fa;
build_merge(p,l,mid-1,0);build_merge(p,mid+1,r,1);
pushup(p);
}
void insert(int x,int cnt)
{
int i=0;
while(a[i+1]=getchar())
{
if(a[i+1]!=10&&a[i+1]!=13){
i++;if(i==cnt)break;
}
}
//printf("%s\n",a+1);
int p=x+1;
x=find(x);p=find(p);splay(x,0);splay(p,rt);
build_merge(p,1,cnt,0);
pushup(p);pushup(x);
}
void del(int x,int p)
{
x=find(x);p=find(p);
splay(x,0);splay(p,rt);
rec(ls);
ls=0;
pushup(p);pushup(x);
}
void print(int p)
{
if(!p)return ;
if(ls>2)print(ls);
printf("%c",val[p]);
if(rs>2)print(rs);
}
int main()
{
scanf("%d",&n);
tot=sz=2;
ch[1][1]=2;
f[2]=1;
siz[1]=2;siz[2]=1;
rt=1;
pos++;
int i,x,y;
for(int i=1;i<=n;i++)
{
scanf("%s",opt);
//printf("%d\n",i);
if(opt[0]=='M'){
scanf("%d",&x);
pos=x+1;
}else if(opt[0]=='I'){
scanf("%d",&x);
insert(pos,x);sz+=x;
}else if(opt[0]=='D'){
scanf("%d",&x);
if(pos+x+1>sz)x=sz-pos-1;
del(pos,pos+x+1);sz-=x;
}else if(opt[0]=='G'){
scanf("%d",&x);
int p=pos;
x=p+x+1;
p=find(p);
x=find(x);
splay(p,0);
splay(x,rt);
print(ch[x][0]);puts("");
}else if(opt[0]=='P'){
pos--;
}else{
pos++;
}
}
}

BZOJ_1269&&1507_[AHOI2006]文本编辑器editor&&[NOI2003]Editor的更多相关文章

  1. 【bzoj1507】[NOI2003]Editor /【bzoj1269】[AHOI2006]文本编辑器editor Splay

    [bzoj1507][NOI2003]Editor 题目描述 输入 输入文件editor.in的第一行是指令条数t,以下是需要执行的t个操作.其中: 为了使输入文件便于阅读,Insert操作的字符串中 ...

  2. AHOI2006文本编辑器editor

    1269: [AHOI2006]文本编辑器editor Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1885  Solved: 683[Submit ...

  3. 【BZOJ1269/1507】[AHOI2006]文本编辑器editor Splay

    [BZOJ1269][AHOI2006]文本编辑器editor Description 这些日子,可可不和卡卡一起玩了,原来可可正废寝忘食的想做一个简单而高效的文本编辑器.你能帮助他吗?为了明确任务目 ...

  4. BZOJ 1269: [AHOI2006]文本编辑器editor( splay )

    splay..( BZOJ 1507 题目基本相同..双倍经验 ) ------------------------------------------------------------------ ...

  5. BZOJ 1269: [AHOI2006]文本编辑器editor (splay tree)

    1269: [AHOI2006]文本编辑器editor Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1213  Solved: 454[Submit ...

  6. BZOJ1269 [AHOI2006]文本编辑器editor 【82行splay】

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

  7. [AHOI2006] 文本编辑器editor

    Description 这些日子,可可不和卡卡一起玩了,原来可可正废寝忘食的想做一个简单而高效的文本编辑器.你能帮助他吗?为了明确任务目标,可可对"文本编辑器"做了一个抽象的定义: ...

  8. [bzoj1269][AHOI2006文本编辑器editor] (splay模版题 or pb_ds [rope]大法)

    Description 这些日子,可可不和卡卡一起玩了,原来可可正废寝忘食的想做一个简单而高效的文本编辑器.你能帮助他吗?为了明确任务目标,可可对“文本编辑器”做了一个抽象的定义:   文本:由0个或 ...

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

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

随机推荐

  1. 清楚css浮动的三种方法

    第一种:添加新元素,应用clear:both;  <div class="clear"></div> css样式:clear:both; 第二种:在浮动元素 ...

  2. getContext在谷歌浏览器中,使用时要先加载canvas对象,否则会提示'getContext is null'

    <body> <canvas id=" style="border:1px solid #c3c3c3;"> Your browser does ...

  3. ios中block访问外部变量的一些注意点

    Block类型是一个C级别的语法和运行机制.它与标准的C函数类似,不同之处在于,它除了有可执行代码以外,它还包含了与堆.栈内存绑定的变量.因此,Block对象包含着一组状态数据,这些数据在程序执行时用 ...

  4. char 与 String 相等比较

    这是一个相当2 相当基础 相当没有意义的帖子:但今天因为这个问题引发了一个bug.小细节也很重要!!!         char a='1'; //      char b='2dsf'; //cha ...

  5. eclipse3.7+resin4.0集成配置小结

    1.插件不要用improve公司的了,那个太老了.直接用resin官方的,用eclipse的help->install new software功能,地址用:http://www.caucho. ...

  6. 与班尼特·胡迪一起拿奖学金(HZNU-2273)

    与班尼特·胡迪一起拿奖学金 AC Time Limit:  2 s      Memory Limit:   256 MB Description 班尼特·胡迪这学期的体测终于上80分了,当期末考试的 ...

  7. MacOS多版本Python切换方案

    1. 安装homebrew 官网 http://brew.sh/index_zh-cn.html 打开终端,在终端中粘贴如下脚本 /usr/bin/ruby -e "$(curl -fsSL ...

  8. 【leetcode】 算法题 两数之和

      问题       给定一个整数数组和一个目标值,找出数组中和为目标值的两个数. 你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用. 示例: 给定 nums = [2, 7, 11, 1 ...

  9. js实现地图打印功能

    注意:js对地图的打印功能在arcgis10.1中才有提供,所以如果要使用esri自带的地图打印功能,必须使用arcgis 10.1或更高版本的地图打印模板.(由于官网和arcgis desktop提 ...

  10. 再探Circuit Breaker之使用Polly

    前言 上一篇介绍了使用Steeltoe来处理服务熔断,这篇我们将用Polly来处理服务熔断. 不废话了,直接进正题. 简单的例子 同样先定义一个简单的服务. [Route("api/[con ...