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. Tensorflow版Faster RCNN源码解析(TFFRCNN) (3)推断(测试)过程使用RPN时代码运行流程

    本blog为github上CharlesShang/TFFRCNN版源码解析系列代码笔记第三篇   推断(测试)过程不使用RPN时代码运行流程 作者:Jiang Wu  原文见:https://hom ...

  2. 使用Robot类模拟鼠标、键盘事件

    Robot类用于模拟鼠标.键盘事件,生成本机系统输入事件.Robot 的主要用于自动化.自运行的程序和其他需要自动控制鼠标和键盘的程序 相当于实际操作的效果,不仅仅只是生成对应的鼠标.键盘事件.比如R ...

  3. centOS 下开启端口号

    firewall-cmd --zone=public --add-port=80/tcp --permanent permanent参数表示永久生效 更新防火墙规则  firewall-cmd --r ...

  4. 192.168.28.168:3000打开网页无法调试localhost为前缀的接口

    最近我在IIS上发布.net Core API的时候发现 当我用localhost去打开我的web项目时 并且,ajax调用的接口前缀为localhost时候,运行正确 但是当我用192.168.28 ...

  5. Python +selenium之设置元素等待

    注:本文转载http://www.cnblogs.com/mengyu/p/6972968.html 当浏览器在加载页面时,页面上的元素可能并不是同时被加载完成,这给元素的定位增加了困难.如果因为在加 ...

  6. jacvaSe-LinkedList

    package com.java.chap08.sec02; import java.util.LinkedList; public class TestLinkedList { private st ...

  7. javaSe-反射3

    package com.java.chap07.sec04; public class Student { private String name; private Integer age; publ ...

  8. js进阶之function对象

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...

  9. 洛谷 P1074 靶形数独

    题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他 们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教, Z 博士拿出了他最近发明的 ...

  10. 一把剪刀看懂git reset 和它的三个参数

    都说git 命令难记且难懂,但是如果从立体的角度看待git与git管理的版本,那么一切都会明朗许多. 大多数的学习教程为了理解git,会绘制几个圆圈的串联,每个圆圈代表一个commit的版本,也就是从 ...