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 ...
随机推荐
- Java 对比Hashtable、Hashmap、Treemap有什么不同?
①基本理解 Hashtable.Hashmap.Treemap都是最常见的一些Map实现,是以键值对的形式存储和操作数据的容器类型. Hashtable是Java类库提供的一个哈希实现,本身是同步的, ...
- Netflix Hystrix — 应对复杂分布式系统中的延时和故障容错 转
转自 https://segmentfault.com/a/1190000005988895 前言 分布式系统中经常会出现某个基础服务不可用造成整个系统不可用的情况, 这种现象被称为服务雪崩效应. 为 ...
- Windows MFC控件消息编程
1. Progress Bar Control Messages PBM_DELTAPOS PBM_GETPOS PBM_GETRANGE PBM_SETBARCOLOR ...
- 在vi中打开多个文件,复制一个文件中多行到另一个文件中
:set number 查看行号1.vi a.txt b.txt或者vi *.txt 2.文件间切换 :n切换到下一个文件,:wn保存再切换 :N到上一个文件,:wN保存再切换 :.=看当前行 3.比 ...
- 使用C++11实现一个半同步半异步线程池
前言 C++11之前我们使用线程需要系统提供API.posix线程库或者使用boost提供的线程库,C++11后就加入了跨平台的线程类std::thread,线程同步相关类std::mutex.std ...
- php与js 编码解码交互
javascript: var fontcolorEncode=encodeURIComponent(fontcolor.value); //编码 php: $fontcolordecode= u ...
- Autowire
Field userService in com.demo.web.Controller.HomeController required a single bean, but 2 were found ...
- Python面试题之Python中的lambda map filter reduce zip
当年龟叔想把上面列出来的这些都干掉.在 “All Things Pythonic: The fate of reduce() in Python 3000”这篇文章中,他给出了自己要移除lambda. ...
- FTP 两种工作模式
主动模式port FTP主动模式:TCP链接客户端访问FTP,客户端会开启一个大于1024的端口N访问FTP的21端口(控制端口),并通过21端口发送port命令与N+1的端口,服务端收到命令后会使用 ...
- 20145331 《Java程序设计》第6周学习总结
20145331 <Java程序设计>第6周学习总结 教材学习内容总结 第十章 输入/输出 10.1.1串流 •Java将输入/输出抽象化为串流,数据有来源及目的地,衔 ...