「NOI2003」文本编辑器 - rope大法好! | Bill Yang's Blog

「NOI2003」文本编辑器 - rope大法好!

题目大意

很久很久以前,DOS3.x的程序员们开始对EDLIN感到厌倦。于是,人们开始纷纷改用自己写的文本编辑器……
多年之后,出于偶然的机会,小明找到了当时的一个编辑软件。进行了一些简单的测试后,小明惊奇地发现:那个软件每秒能够进行上万次编辑操作(当然,你不能手工进行这样的测试)!于是,小明废寝忘食地想做一个同样的东西出来。你能帮助他吗?
为了明确任务目标,小明对“文本编辑器”做了一个抽象的定义:
文本:由$0$个或多个字符构成的序列。这些字符的ASCII码在闭区间$[32,126]$内,也就是说,这些字符均为可见字符或空格。
光标:在一段文本中用于指示位置的标记,可以位于文本的第一个字符之前,文本的最后一个字符之后或文本的某两个相邻字符之间。
文本编辑器:为一个可以对一段文本和该文本中的一个光标进行如下六条操作的程序。如果这段文本为空,我们就说这个文本编辑器是空的。

比如一个空的文本编辑器依次执行操作 INSERT(13, “Balanced tree”)MOVE(2)DELETE(5)NEXT()INSERT(7, “ editor”)MOVE(0)GET(16)后,会输出“Bad editor tree”
你的任务是:
建立一个空的文本编辑器。
从输入文件中读入一些操作指令并执行。
对所有执行过的GET操作,将指定的内容写入输出文件。


题目分析

AHOI2006文本编辑器阉割版。


代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#include<algorithm>
#include<iostream>
#include<ext/rope>
#include<iomanip>
#include<cstring>
#include<cstdlib>
#include<vector>
#include<cstdio>
#include<cmath>
#include<queue>
using namespace std;
using namespace __gnu_cxx;
rope<char>R;
inline const int Get_Int() {
int num=0,bj=1;
char x=getchar();
while(x<'0'||x>'9') {
if(x=='-')bj=-1;
x=getchar();
}
while(x>='0'&&x<='9') {
num=num*10+x-'0';
x=getchar();
}
return num*bj;
}
void Get_String(int n,char* a) {
for(int i=0; i<n; i++) {
a[i]='\0';
while(a[i]<32||a[i]>126)a[i]=getchar();
}
a[n]='\0';
}
char a[1<<20];
int t,pos=0;
int main() {
t=Get_Int();
while(t--) {
char opt='\0';
while(!isalpha(opt=getchar()));
while(isalpha(getchar()));
if(opt=='P')pos--;
else if(opt=='N')pos++;
else if(opt=='G') {
int len=Get_Int();
for(int i=pos; i<pos+len; i++)printf("%c",R[i]);
putchar('\n');
}
else if(opt=='M')pos=Get_Int();
else if(opt=='I') {
int len=Get_Int();
Get_String(len,a);
R.insert(pos,a);
} else if(opt=='D') {
int len=Get_Int();
R.erase(pos,len);
}
}
return 0;
}
姥爷们赏瓶冰阔落吧~
0%