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. 面向对象(this的问题一)

    <!DOCTYPE HTML><html><head><meta http-equiv="Content-Type" content=&q ...

  2. 服务端搭建——腾讯云通信(IM)

    前言 在手机app中因为需要即时聊天功能,在项目采用腾讯云通信服务.如下流程图: 当手机端拿到签名后,就可登录IM,使用im提供的sdk收发信息. 准备工作 1.在腾讯云注册获取appid 2.申请开 ...

  3. DB2常用命令2

    1.启动实例(db2inst1):实例相当于informix中的服务 db2start 2.停止实例(db2inst1): db2stop 3.列出所有实例(db2inst1) db2ilist 4. ...

  4. 全面解读Java NIO工作原理(1)

    全面解读Java NIO工作原理(1) 2011-12-14 10:31 Rollen Holt Rollen Holt的博客 我要评论(0) 字号:T | T JDK 1.4 中引入的新输入输出 ( ...

  5. Memcache架构新思考

    2011年初Marc Kwiatkowski通过Memecache@Facebook介绍了Facebook的Memcache架构,现在重新审视这个架构,仍有很多方面在业界保持先进性.作为weibo内部 ...

  6. CSS3实现多种背景效果

    灵活的背景定位 实现效果: 将背景图定位到距离容器底边 10px 且距离右边 20px 的位置. background-position 方案 实现代码: <div>海盗密码</di ...

  7. centos安装nginx(针对一哥们的博客进行的详细补充(用红色字体标出了补充部分))

    centos安装nginx 原文地址:http://www.cnblogs.com/leechenxiang/p/5402960.html 一.什么是nginx 是一个C语言开发的HTTP反向代理服务 ...

  8. git push The requested URL returned error: 403 Forbidden while accessing

    错误提示信息: error: The requested URL returned error: Forbidden while accessing https://github.com/xingfu ...

  9. R语言学习 第十一篇:日期和时间

    R语言的基础包中提供了三种基本类型用于处理日期和时间,Date用于处理日期,它不包括时间和时区信息:POSIXct/POSIXlt用于处理日期和时间,其中包括了日期.时间和时区信息.R内部在存储日期和 ...

  10. 大型三甲医院信息管理系统源码 His系统功能齐全 完整可用

    详情请点击查看 开发环境 :Asp.net + VS2005 + C# + SQL2010(含三种数据库access,oracle,sql server)    采用了BS+ActiveX + Web ...