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. 二维码js生成库

    jr-qrcode 把字符串生成二维码,并以Base64 URL形式输出. 支持白色二维码,即反色二维码. 兼容性 插件使用了H5的canvas特性进行二维码绘制,最后输出base64 url,因此本 ...

  2. iframe之局部刷新

      例如: <iframe src="1.htm" name="ifrmname" id="ifrmid"></ifram ...

  3. Math类的方法应用

    class Mortgage { public static void main(String[]args) { double P=Double.parseDouble(args[0]); doubl ...

  4. py-oauth2包使用简记

    接前两天线上项目py2升级py3的书,老廖的一个旧库snspy,他已经不维护了,用的api又比较久,不好升级,最后速度找了个OAuth库取代了它,由于时间紧张,直接在pypi上搜索了一下,找到这个支持 ...

  5. 基于Python的数据分析(2):字符串编码

    在上一篇文章<基于Python的数据分析(1):配置安装环境>中的第四个步骤中我们在python的启动步骤中强制要求加载sitecustomize.py文件并设置其默认编码为"u ...

  6. 【转】javascript 作用域链

    JavaScript函数的作用域链分为定义时作用域链和运行时作用域链: 函数被定义的时候,它有一个属性[[scope]]标明它的定义作用域链,定义时作用域链[[scope]]遵守这样的规则:一个函数的 ...

  7. Python并发编程之创建多线程的几种方法(二)

    大家好,并发编程 进入第二篇. 今天的内容会比较基础,主要是为了让新手也能无障碍地阅读,所以还是要再巩固下基础.学完了基础,你们也就能很顺畅地跟着我的思路理解以后的文章. 本文目录 学会使用函数创建多 ...

  8. Python3 urllib.request库的基本使用

    Python3 urllib.request库的基本使用 所谓网页抓取,就是把URL地址中指定的网络资源从网络流中读取出来,保存到本地. 在Python中有很多库可以用来抓取网页,我们先学习urlli ...

  9. URL 规范 整理

    URL 规范 不用大写:(强制) 用中杠-不用下杠_:(强制) 参数列表要encode,编码使用utf-8:(强制) URI中的名词表示资源集合,使用复数形式.(建议) 增加版本号(建议) URI中统 ...

  10. 19.QT-事件发送函数sendEvent()、postEvent()

    Qt发送事件分为两种 -阻塞型事件发送 需要重写接收对象的event()事件处理函数 当事件发送后,将会立即进入event()事件处理函数进行事件处理 通过sendEvent()静态函数实现阻塞发送: ...