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. Unity3d网格合并

    几个不同的物体,在Unity3d中可以将网格合并在一起,用于优化. 在Unity3d中构建临时场景如下:建一C#脚本名为"CombineMeshes",挂在Cube上. Combi ...

  2. JAVA代码之斗地主发牌

    理解很好理解,关键是思路 按照斗地主的规则,完成洗牌发牌的动作: 具体规则: 1. 组装54张扑克牌 2. 将54张牌顺序打乱 3. 三个玩家参与游戏,三人交替摸牌,每人17张牌,最后三张留作底牌. ...

  3. JavaWeb项目开发中eclipse缓存问题

    学习Java快2年了 有时候改完代码启动tomcat测试时,新代码不生效,这可能就是缓存问题. 所以平时就用以下几个方法解决,如果还是解决不了,就找老师吧! 1.清理项目 2.移除项目,清理tomca ...

  4. js正则匹配获取文件名

    //获取文件名,不带后缀 var file_name=file_path.replace(/(.*\/)*([^.]+).*/ig,"$2"); //获取文件后缀 1.var Fi ...

  5. [ros]编译ORBSLAM2时候,ros路径问题

    CMake Error at CMakeLists.txt:2 (include): include could not find load file: /core/rosbuild/rosbuild ...

  6. Azure 门户使用概览

    Azure 门户是管理 Azure 云平台的核心工具,用户可以在其中预配和管理 Azure 资源.本教程将帮助你熟悉Azure管理门户,包括一些关键功能的介绍,并演示了如何通过 Azure 门户创建虚 ...

  7. LR中变量、参数的使用介绍

    Action(){ char * url = "www.baidu.com"; char arr_url[1024]; //将url变量的值复制给p_url1参数 lr_save_ ...

  8. python基础教程总结4—基本语句

    一.print 和 import 的更多信息 print 打印多个表达式也是可行的,只要将它们用逗号隔开就好: >>> print('Age:' , 42) Age: 42 可以看到 ...

  9. SAP ERP和C4C Account和Contact的双向同步

    Account和Contact是C4C里唯一支持可以和ERP进行双向同步的主数据类别. C4C里创建一个Account:Mouser Electronics 在C4C里保存Account,自动同步到E ...

  10. win7下一直试用Beyond Compare 4

    找到目录C:\Users\用户名\AppData\Roaming\BeyondCompare,将这个目录删除,重启compare即可.