题解:

splay维护

只不过变成了字符串

代码:

#include<bits/stdc++.h>
using namespace std;
const int L=+,BS= + ,BN= + ;
int Cur=,head,tot;
char str[L];
struct Block
{
int size,nxt;
bool rev;
char a[BS];
void Clear(){size=;nxt=-,rev=;}
}B[BN];
queue<int>q;
int NewNode()
{
int t=q.front();q.pop();
B[t].Clear();
return t;
}
void Pre()
{
while (q.size()!=)q.pop();
for (int i=;i<BN;i++)q.push(i);
head=NewNode();
}
void Find(int &idx,int &cur)
{
while(idx!=-&&cur>B[idx].size)cur-=B[idx].size,idx=B[idx].nxt;
}
void Pushdown(int idx)
{
if (B[idx].rev)
{
reverse(B[idx].a,B[idx].a+B[idx].size);
B[idx].rev=;
} }
void Split(int idx,int cur)
{
if(idx==-||cur==B[idx].size)return;
Pushdown(idx);
int tot=NewNode();
memcpy(B[tot].a,B[idx].a+cur,sizeof(char)*(B[idx].size-cur) );
B[tot].size=B[idx].size-cur;
B[idx].size=cur;
B[tot].nxt=B[idx].nxt;
B[idx].nxt=tot;
}
void Delet(int idx){q.push(idx);}
void Merge(int idx)
{
for (int i=idx;i!=-;i=B[i].nxt)
for (int j=B[i].nxt;j!=-;j=B[j].nxt)
{
if (B[i].size+B[j].size<=BS)
{
Pushdown(i);
Pushdown(j);
memcpy(B[i].a+B[i].size,B[j].a,sizeof(char) * B[j].size);
B[i].size+=B[j].size;B[i].nxt=B[j].nxt;
Delet(j);
}
else break;
}
}
void Insert(int cur,int x,char *str)
{
int idx=head;
Find(idx,cur);
Split(idx,cur);
int i=;
while(i<x)
{
int Limit=min(BS,x-i);
int tot=NewNode();
memcpy(B[tot].a,str+i,sizeof(char) * Limit);
B[tot].size=Limit;
B[tot].nxt=B[idx].nxt;
B[idx].nxt=tot;
idx=B[idx].nxt;
i+=Limit;
}
Merge(head);
}
void Print(int cur)
{
int idx=head;
Find(idx,cur);
if(cur==B[idx].size) idx=B[idx].nxt,cur=;
Pushdown(idx);
printf("%c\n",B[idx].a[cur]);
}
void Rever(int l,int r)
{
int idx=head;
Find(idx,l);
Split(idx,l);
int Start=idx,StartNxt=B[idx].nxt;
idx=head;
Find(idx,r);
Split(idx,r);
int EndNxt=B[idx].nxt,Tmp[BN],cnt=;
for (int i=StartNxt;i!=EndNxt;i=B[i].nxt)B[i].rev^=,Tmp[++cnt]=i;
Tmp[++cnt]=Start;Tmp[]=EndNxt;
for (int i=cnt;i>=;i--)B[Tmp[i]].nxt=Tmp[i-];
Merge(head);
}
void Dele(int l,int r)
{
int idx=head;
Find(idx,l);
Split(idx,l);
int Start=idx,StartNxt=B[idx].nxt;
idx=head;
Find(idx,r);
Split(idx,r);
int EndNxt=B[idx].nxt;
for (int i=StartNxt;i!=EndNxt;i=B[i].nxt)Delet(i);
B[Start].nxt=EndNxt;
Merge(head);
}
int main()
{
int N;
scanf("%d",&N);
char opt[];
Pre();
while(N--)
{
scanf("%s",opt);
if (opt[]=='M') scanf("%d",&Cur);
else if (opt[]=='I')
{
int len;
scanf("%d",&len);
int i=;
while(i<len){char ch=getchar();if (ch>=&&ch<=)str[i++]=ch;}
str[i++]='\0';
Insert(Cur,len,str);
}
else if(opt[]=='D')
{
int x;
scanf("%d",&x);
Dele(Cur,Cur+x);
}
else if(opt[]=='R')
{
int x;
scanf("%d",&x);
Rever(Cur,x+Cur);
}
else if(opt[]=='G')Print(Cur);
else if(opt[]=='P')Cur--;
else if(opt[]=='N')Cur++;
}
return ;
}

bzoj1269的更多相关文章

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

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

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

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

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

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

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

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

  5. BZOJ1269——[AHOI2006]文本编辑器editor

    1.题意:各种splay操作,一道好的模板题2333 2.分析:splay模板题,没啥解释QAQ #include <stack> #include <cstdio> #inc ...

  6. [BZOJ1269] [AHOI2006] 文本编辑器editor (splay)

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

  7. [BZOJ1269]文本编辑器editor

    Problem 有n个操作 Solution splay模板题,用splay维护下标. Notice 需要把l的前一个位置旋转到根,r的后一个位置旋转到根的右节点.所以特别要注意0的大坑. Code ...

  8. [NOI2003]Editor & [AHOI2006]文本编辑器editor BZOJ1507&BZOJ1269

    分析: Splay区间操作裸题,维护出区间信息,按照要求模拟,注意读入格式,并且考虑内存回收(开不下) 附上代码: #include <cstdio> #include <algor ...

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

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

随机推荐

  1. TOSCA自动化测试工具--Log defect

    1.执行完用例后,对于失败的用例进行分析,如果有缺陷,可以提对应的缺陷 2.在issues模块, 右键创建自己需要的文件夹,然后在文件夹上右键找到虫子图形点下,就可以创建缺陷了,填上对应的内容 3.如 ...

  2. JVM基本配置与调优

    JVM基本配置与调优 JVM调优,一般都是针对堆内存配置调优. 如图:堆内存分新生代和老年代,新生代又划分为eden区.from区.to区. 一.区域释义 JVM内存模型,堆内存代划分为新生代和老年代 ...

  3. java并发再次积累

    监视器与锁之间的关系: 1.object monitor 是任何一个对象都有的内置的数据结构,它是用来协调使用当前对象的多个线程之间的执行顺序的(wait/notify),线程会block或者wait ...

  4. windows库

    1.windows库的存在方式 1.1.静态库:不能被加载的程序,可以理解为目标程序的归档:*.lib. 1.2.动态库:是可以被加载的程序:*.dll. 2.静态库 2.1.静态库的特点    目标 ...

  5. CSS Display(显示)和Visibility(可见性)

    CSS Display(显示)和Visibility(可见性) 一.简介 display属性设置一个元素应如何显示(隐藏不占用空间),visibility属性指定一个元素应可见还是隐藏(隐藏占用空间) ...

  6. Python3.x:selenium获取iframe内嵌页面的源码

    Python3.x:selenium获取iframe内嵌页面的源码 前言 在一些网页中经常会看到ifrmae/frame标签,iframe是嵌入式框架一般用来在已有的页面中嵌入另一个页面,当一个元素在 ...

  7. 如何用纯 CSS 创作一只徘徊的果冻怪兽

    效果预览 在线演示 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/VdOKQG 可交互视频 ...

  8. Labview 查看一次while循环运行的时间

    在while循环中增加一个移位寄存器,移位寄存器的初始值使用时间计数器,在while循环里面增加一个减法Vi,再增加一个时间计数器,两者做差,最后显示差值. 在这里只能显示大概运行时间.如下图.

  9. ubuntu 18.04 64bit下如何安装python开发工具jupyter

    1.执行一下命令进行安装 sudo apt-get install python3-distutils wget https://bootstrap.pypa.io/get-pip.py sudo p ...

  10. poj_2528 Mayor's posters (线段树经典题+离散化方法)

    由于题面中给定的wall最大长度为10 000 000:若简单用线段树势必会超时. 而注意到题面中规定了输入海报的个数<=1000:因此不妨离散化,使得线段中叶节点仅含有1000个,那么线段最大 ...