bzoj1269
题解:
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的更多相关文章
- 【BZOJ1269/1507】[AHOI2006]文本编辑器editor Splay
[BZOJ1269][AHOI2006]文本编辑器editor Description 这些日子,可可不和卡卡一起玩了,原来可可正废寝忘食的想做一个简单而高效的文本编辑器.你能帮助他吗?为了明确任务目 ...
- 【bzoj1507】[NOI2003]Editor /【bzoj1269】[AHOI2006]文本编辑器editor Splay
[bzoj1507][NOI2003]Editor 题目描述 输入 输入文件editor.in的第一行是指令条数t,以下是需要执行的t个操作.其中: 为了使输入文件便于阅读,Insert操作的字符串中 ...
- [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 这些日子,可可不和卡卡一起玩了,原来可可正 ...
- BZOJ1269——[AHOI2006]文本编辑器editor
1.题意:各种splay操作,一道好的模板题2333 2.分析:splay模板题,没啥解释QAQ #include <stack> #include <cstdio> #inc ...
- [BZOJ1269] [AHOI2006] 文本编辑器editor (splay)
Description 这些日子,可可不和卡卡一起玩了,原来可可正废寝忘食的想做一个简单而高效的文本编辑器.你能帮助他吗?为了明确任务目标,可可对“文本编辑器”做了一个抽象的定义: 文本:由0个或多 ...
- [BZOJ1269]文本编辑器editor
Problem 有n个操作 Solution splay模板题,用splay维护下标. Notice 需要把l的前一个位置旋转到根,r的后一个位置旋转到根的右节点.所以特别要注意0的大坑. Code ...
- [NOI2003]Editor & [AHOI2006]文本编辑器editor BZOJ1507&BZOJ1269
分析: Splay区间操作裸题,维护出区间信息,按照要求模拟,注意读入格式,并且考虑内存回收(开不下) 附上代码: #include <cstdio> #include <algor ...
- BZOJ1269 [AHOI2006]文本编辑器editor 【82行splay】
1269: [AHOI2006]文本编辑器editor Time Limit: 10 Sec Memory Limit: 162 MB Submit: 4633 Solved: 1782 [Sub ...
随机推荐
- XPath Checker 和 firebug 插件使用
安装插件: 1.firebug 2.FirePath 3.xpath finder 4.XPath Checker XPath Checker 下载安装 https://addons.mozilla. ...
- Please check registry access list (whitelist/blacklist)
https://blog.csdn.net/sprita1/article/details/51735566
- Nginx配置性能优化(转)
原文地址:http://blog.csdn.net/xifeijian/article/details/20956605 高层的配置 nginx.conf文件中,Nginx中有少数的几个高级配置在模块 ...
- java并发再次积累
监视器与锁之间的关系: 1.object monitor 是任何一个对象都有的内置的数据结构,它是用来协调使用当前对象的多个线程之间的执行顺序的(wait/notify),线程会block或者wait ...
- 负载均衡技术在CDN中发挥着重要作用
转载地址:http://www.qicaispace.com/gonggao/server/page01/info07.asp CDN是一个经策略性部署的整体系统,能够帮助用户解决分布式存储.负载均衡 ...
- windows安装git客户端
1:线上git地址 https://github.com/ 2:tortoiseGit地址 http://tortoisegit.org 3:安装步骤 操作系统:Windows XP SP3 Git客 ...
- 【WPF】修改ComboBox样式
修改WPF默认的ComboBox控件样式 如下图所示: 修改代码如下: <UserControl.Resources> <Style TargetType="ToggleB ...
- CSS Float(浮动)
CSS Float(浮动) 一.CSS Float(浮动) CSS 的 Float(浮动),会使元素向左或向右移动,其周围的元素也会重新排列. Float(浮动),往往是用于图像,但它在布局时一样非常 ...
- Java如何清空数组、对象
//清空 public class Clear { public static void main(String[] args){ // List<String> a= new Array ...
- Junit中的setup和teardown方法
setup需要@before注解,实现测试前的初始化工作 teardown需要@after注解,测试完成后垃圾回收等后续工作