1507: [NOI2003]Editor

Time Limit: 5 Sec  Memory Limit: 162 MB
Submit: 4157  Solved: 1677
[Submit][Status][Discuss]

Description

Input

输入文件editor.in的第一行是指令条数t,以下是需要执行的t个操作。其中: 为了使输入文件便于阅读,Insert操作的字符串中可能会插入一些回车符,请忽略掉它们(如果难以理解这句话,可以参考样例)。 除了回车符之外,输入文件的所有字符的ASCII码都在闭区间[32, 126]内。且行尾没有空格。 这里我们有如下假定:  MOVE操作不超过50000个,INSERT和DELETE操作的总个数不超过4000,PREV和NEXT操作的总个数不超过200000。  所有INSERT插入的字符数之和不超过2M(1M=1024*1024),正确的输出文件长度不超过3M字节。  DELETE操作和GET操作执行时光标后必然有足够的字符。MOVE、PREV、NEXT操作必然不会试图把光标移动到非法位置。  输入文件没有错误。 对C++选手的提示:经测试,最大的测试数据使用fstream进行输入有可能会比使用stdio慢约1秒。

Output

输出文件editor.out的每行依次对应输入文件中每条GET指令的输出。

Sample Input

15
Insert 26
abcdefghijklmnop
qrstuv wxy
Move 15
Delete 11
Move 5
Insert 1
^
Next
Insert 1
_
Next
Next
Insert 4
.\/.
Get 4
Prev
Insert 1
^
Move 0
Get 22

Sample Output

.\/.
abcde^_^f.\/.ghijklmno

code

 #include<cstdio>
#include<cstring> const int MAXL = ;
const int Block_size = ;
const int Block_num = ;
int Number[Block_num],Tot;
int nxt[Block_num],siz[Block_num];
char data[Block_num][Block_size];
char str[MAXL],s[]; void Init() {
for (int i=; i<Block_num; ++i)
Number[i] = i;
Tot = ;
nxt[] = -;siz[] = ;
}
int Getnum() {
return Number[Tot++];
}
void Delnum(int x) {
Number[--Tot] = x;
}
int find(int &pos) {
int k = ;
while (k != - && pos > siz[k]) {
pos -= siz[k];
k = nxt[k];
}
return k;
}
void Madenews(int cur,int news,int num,char str[]) {
if (news!=-) {
nxt[news] = nxt[cur];
siz[news] = num;
memcpy(data[news],str,num);
}
nxt[cur] = news;
}
void split(int cur,int pos) {
if (cur==- || pos==siz[cur]) return ;
int news = Getnum();
Madenews(cur,news,siz[cur]-pos,data[cur]+pos);
siz[cur] = pos;
}
void Merge(int x,int y) {
memcpy(data[x]+siz[x],data[y],siz[y]);
siz[x] += siz[y];
nxt[x] = nxt[y];
Delnum(y);
}
void Maintain() {
int cur = ;
while (cur != -) {
int p = nxt[cur];
while (p != - && siz[cur] + siz[p] <= Block_size) {
Merge(cur,p);
p = nxt[cur];
}
cur = nxt[cur];
}
}
void Insert(int pos,int num,char str[]) {
int cur = find(pos);
split(cur,pos);
int cnt = ;
while (cnt + Block_size <= num) {
int news = Getnum();
Madenews(cur,news,Block_size,str+cnt);
cur = news;
cnt += Block_size;
}
if (num - cnt) {
int news = Getnum();
Madenews(cur,news,num-cnt,str+cnt);
}
Maintain();
}
void Erase(int pos,int num) {
int cur = find(pos);
split(cur,pos);
int p = nxt[cur];
while (p != - && num > siz[p]) {
num -= siz[p];
p = nxt[p];
}
split(p,num);
p = nxt[p];
for (int i=nxt[cur]; i!=p; i=nxt[cur]) {
nxt[cur] = nxt[i];
Delnum(i);
}
Maintain();
}
void Getdata(int pos,int num,char str[]) {
int cur = find(pos);
int cnt = siz[cur] - pos;
if (num < cnt) cnt = num;
memcpy(str,data[cur]+pos,cnt);
int tmp = nxt[cur];
while (tmp!=- && cnt+siz[tmp] <= num) {
memcpy(str+cnt,data[tmp],siz[tmp]);
cnt += siz[tmp];
tmp = nxt[tmp];
}
if (num - cnt && tmp != -)
memcpy(str+cnt,data[tmp],num-cnt);
str[num] = '\0';
}
int main() {
Init();
int Nowpos = ,opt,num;
scanf("%d",&opt);
while (opt) {
opt--;
scanf("%s",s);
if (s[]=='M') scanf("%d",&Nowpos);
else if (s[]=='I') {
scanf("%d",&num);
for (int i=; i<num; ++i) {
scanf("%c",&str[i]);
if (str[i]< || str[i]>) --i;
}
Insert(Nowpos,num,str);
}
else if (s[]=='D') {
scanf("%d",&num);
Erase(Nowpos,num);
}
else if (s[]=='G') {
scanf("%d",&num);
Getdata(Nowpos,num,str);
printf("%s\n",str);
}
else if (s[]=='P') --Nowpos;
else ++Nowpos;
}
return ;
}

1507: [NOI2003]Editor(块状链表)的更多相关文章

  1. 【BZOJ-1507】Editor 块状链表

    1507: [NOI2003]Editor Time Limit: 5 Sec  Memory Limit: 162 MBSubmit: 3397  Solved: 1360[Submit][Stat ...

  2. 1507: [NOI2003]Editor

    1507: [NOI2003]Editor Time Limit: 5 Sec  Memory Limit: 162 MB Submit: 3535  Solved: 1435 [Submit][St ...

  3. 【BZOJ 1507】【NOI 2003】&【Tyvj P2388】Editor 块状链表模板题

    2016-06-18 当时关于块状链表的想法是错误的,之前维护的是一个动态的$\sqrt{n}$,所以常数巨大,今天才知道原因TwT,请不要参照这个程序为模板!!! 模板题水啊水~~~ 第一次写块状链 ...

  4. 【BZOJ】1507: [NOI2003]Editor(Splay)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1507 当练splay模板了,发现wjmzbmr的splay写得异常简介,学习了.orzzzzzzzz ...

  5. BZOJ 1507 [NOI2003]Editor

    Description Input 输 入文件editor.in的第一行是指令条数t,以下是需要执行的t个操作.其中: 为了使输入文件便于阅读,Insert操作的字符串中可能会插入一些回车符,请忽略掉 ...

  6. BZOI 1507 [NOI2003] Editor

    Background After trying to solve problem EDIT1(Editor) and being ****ed by Brainf**k, Blue Mary deci ...

  7. BZOJ 1507 NOI2003 Editor Splay

    题目大意: 1.将光标移动到某一位置 2.在光标后插入一段字符串 3.删除光标后的一段字符 4.输出光标后的一段字符 5.光标-- 6.光标++ 和1269非常像的一道题,只是弱多了 几个问题须要注意 ...

  8. BZOJ1507 [NOI2003]Editor 【splay】

    1507: [NOI2003]Editor Time Limit: 5 Sec  Memory Limit: 162 MB Submit: 4129  Solved: 1660 [Submit][St ...

  9. BZOJ 1507 Editor(块状链表)

    题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1507 题意:一个文本编辑器,模拟以下操作: 思路:块状链表的主要操作: (1)find( ...

随机推荐

  1. java中两个map比较

    一 /** * 用map的keySet()的迭代器(性能效率较低) * */ public void compareMap1 (){ Map<String, String> m1 = ne ...

  2. eclipse查看jar包源文件

    话不多说上链接 https://www.cnblogs.com/1995hxt/p/5252098.html这里介绍了完整的流程,亲自试过,可以的! 以防以后要用的时候找不到文件的下载地址,所以就先在 ...

  3. 解释器模式和php实现

    解释器模式: 给定一个语言, 定义它的文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中的句子. 角色: 环境角色:定义解释规则的全局信息. 抽象解释器::定义了部分解释具体实现,封装了 ...

  4. MySQL获取某个时间范围内的数据 TO_DAYS(date)函数

    1.利用to_days函数查询今天的数据: select * from 表名 where to_days(时间字段名) = to_days(now()); to_days函数:返回从0000年(公元1 ...

  5. 模态框的理解 ,jQ: loading,进度条, 省级联动 表单验证 插件

    模态框: 打开一个弹框 不关闭它就不能做框外的操作 必须关闭或弹出另外的弹框 加载延迟loading + 进度条只要有请求 就处理一下监控ajax 全局事件jquery: $('#box').ajax ...

  6. 使用jQuery发送ajax

    我们先看一下js的原生ajax 直接进入代码,我们先准备好servlet,之后不会改动,所以先看一下. package cn.curry.servlet; import com.alibaba.fas ...

  7. 关于纠正《Hive权威指南》中的结论~“hive在使用set自定义变量时,hivevar命名空间是可选的”~的论证

    背景: 根据<Hive权威指南>上讲,在hive-0.8.0以后可以使用--define key=value命令定义用户自定义的变量以便在Hive脚本中引用.当用户使用这个功能时,Hive ...

  8. UVA12904 Load Balancing(中途相遇法)

    虽然这题可以用暴力n^3过,但是还有有种n^2的方法的,枚举b,对于b,分别枚举a和c,得到对于这个b的最优解,然后从所以b中选一个最优的. 要保证字典序最小,只要从小往大枚举就好了 感谢moonfl ...

  9. [CV笔记]图像特征提取三大法宝:HOG特征,LBP特征,Haar特征

    (一)HOG特征 1.HOG特征: 方向梯度直方图(Histogram of Oriented Gradient, HOG)特征是一种在计算机视觉和图像处理中用来进行物体检测的特征描述子.它通过计算和 ...

  10. 第008课_第1个ARM落版程序及引申

    form:第008课_第1个ARM裸板程序及引申 第001节_辅线1_硬件知识_LED原理图 当我们学习C语言的时候,我们会写个Hello程序.那当我们下ARM程序,也该有一个简单的程序引领我们入门, ...