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 ...
随机推荐
- 金融即服务(FaaS),将开启场景化金融新格局
转自: https://www.iyiou.com/p/28494/fs/1 [ 亿欧导读 ] 金融即服务揭示了场景金融的实现路径,通过双向连接做一个开放的系统,按需给客户提供金融服务. 本文系作者在 ...
- EF Core 2.0中怎么用DB First通过数据库来生成实体
要在EF Core使用DB First首先要下载三个Nuget包,在Nuget的Package Manager Console窗口中依次敲入下面三个命令即可: Microsoft.EntityFram ...
- ashx 方法模板
; ); //查询字符串拼接 string searchparams = DTRequest.GetQueryString("jsonstring"); fooddetail mo ...
- 利用C++调用天气webservice-gSOAP方法
首先需要下载一个gSOAP工具包 下载路径为:https://sourceforge.NET/projects/gsoap2/ 至于有关于gSOAP的一些用法和包含的文件的说明可从官网查看:http: ...
- 从页面到服务器,node实现文件下载
起因: 新来了一个需求,让用户下载一个200m的zip文件,并且校验用户信息,难点:下载的文件是200M的. 现在维护的系统,以前的文件下载,走的是node的静态文件,用的express框架上自带的静 ...
- MVC中关于 使用后台代码 检查 用户名是否已经被清册
在 注册页面 NewUser 的 Controller中写以下代码 public ActionResult GetUserIndataByUserName() { string UserName= ...
- Spring使用事务
Spring使用事务,一共有4个步骤 1.配置数据源 例如: <bean id="dataSource" class="com.mchange.v2.c3p0.Co ...
- mysql搜索不区分大小写
mysql搜索是不区分大小写的,这种情况下我们有两种方法解决 知识前提: BINARY binary不是函数,而是一个类型转换运算符,它用来强制字符串为一个二进制字符串,可以理解为在字符串比较的时候区 ...
- 快用Visual Studio(二)- 界面,功能区与命令面板
Layout Editing Explorer Saving Searching Command Palette File Navigation File and Folder Based Files ...
- 用python收集系统信息
实现的功能 搜集系统消息,有生产商,CPU型号,核数,内存,主机名,发行版名称 可运行的系统 目前已在RHEL, Ubuntu, Archlinux上测试通过 获取不同发行版主机名逻辑判断思路分析 大 ...