BZOJ_1269&&1507_[AHOI2006]文本编辑器editor&&[NOI2003]Editor
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的更多相关文章
- 【bzoj1507】[NOI2003]Editor /【bzoj1269】[AHOI2006]文本编辑器editor Splay
[bzoj1507][NOI2003]Editor 题目描述 输入 输入文件editor.in的第一行是指令条数t,以下是需要执行的t个操作.其中: 为了使输入文件便于阅读,Insert操作的字符串中 ...
- AHOI2006文本编辑器editor
1269: [AHOI2006]文本编辑器editor Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1885 Solved: 683[Submit ...
- 【BZOJ1269/1507】[AHOI2006]文本编辑器editor Splay
[BZOJ1269][AHOI2006]文本编辑器editor Description 这些日子,可可不和卡卡一起玩了,原来可可正废寝忘食的想做一个简单而高效的文本编辑器.你能帮助他吗?为了明确任务目 ...
- BZOJ 1269: [AHOI2006]文本编辑器editor( splay )
splay..( BZOJ 1507 题目基本相同..双倍经验 ) ------------------------------------------------------------------ ...
- BZOJ 1269: [AHOI2006]文本编辑器editor (splay tree)
1269: [AHOI2006]文本编辑器editor Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1213 Solved: 454[Submit ...
- BZOJ1269 [AHOI2006]文本编辑器editor 【82行splay】
1269: [AHOI2006]文本编辑器editor Time Limit: 10 Sec Memory Limit: 162 MB Submit: 4633 Solved: 1782 [Sub ...
- [AHOI2006] 文本编辑器editor
Description 这些日子,可可不和卡卡一起玩了,原来可可正废寝忘食的想做一个简单而高效的文本编辑器.你能帮助他吗?为了明确任务目标,可可对"文本编辑器"做了一个抽象的定义: ...
- [bzoj1269][AHOI2006文本编辑器editor] (splay模版题 or pb_ds [rope]大法)
Description 这些日子,可可不和卡卡一起玩了,原来可可正废寝忘食的想做一个简单而高效的文本编辑器.你能帮助他吗?为了明确任务目标,可可对“文本编辑器”做了一个抽象的定义: 文本:由0个或 ...
- Bzoj1269 [AHOI2006]文本编辑器editor
Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 3678 Solved: 1380 Description 这些日子,可可不和卡卡一起玩了,原来可可正 ...
随机推荐
- 管理xcode插件
1.打开终端 2.输入 open ~/Library/Application\ Support/Developer/Shared/Xcode/Plug-ins 3.出现 4.想删除那个就随意吧 ...
- H5之postMessage 。实现跨域
对于跨域我们有很多的解决方案,今天我来分享一下postMessage的那点事,postMessage是html5新增的一个解决跨域的一个方法,不过很可惜万恶的ie6,7不支持 postMessage( ...
- 完美支持Py3的微信开发库推荐
之前分享了个代码,后来发现中文发送是乱码,应该是加密代码的问题,然后在又找到这个可完美使用的Py3微信库wechatpy:https://github.com/jxtech/wechatpy
- Webpack vs Browersify vs SystemJs for SPAs
https://engineering.velocityapp.com/webpack-vs-browersify-vs-systemjs-for-spas-95b349a41fa0 Right no ...
- JavaScript头像上传器的实现
最近做这方面的东西,刚开始准备用一个开源项目:https://github.com/yueyoum/django-upload-avatar 后来发现这个开源组件的原设计者的定制化选项设计略显复杂,发 ...
- php中$_FILES应用实例
允许用户从表单上传文件是非常有用的.先来看一段HTML表单代码 <html> <body> <form action="upload_file.php" ...
- Myeclipse使用git
推荐使用服务器:coding,coding的上传很稳定很快 怎么建仓库: coding 这个服务器呢有个很明显的东西就是太的语言可以是中文的, 点头标签的加号就能进行创建仓库了 点击新建就行了 点击这 ...
- Windows下Oracle的下载与安装
一.Oracle下载 官网地址:http://www.oracle.com/technetwork/database/enterprise-edition/downloads/index.html 百 ...
- ThreadPoolExcuter源码解析(一)
1.ThreadPoolExcuter原理说明 首先我们要知道为什么要使用ThreadPoolExcuter,具体可以看看文档中的说明: 线程池可以解决两个不同问题:由于减少了每个任务的调用开销,在执 ...
- Scala学习笔记:重要语法特性
1.变量声明 Scala 有两种变量, val 和 var val的值声明后不可变,var可变 val msg: String = "Hello yet again, world!&quo ...