Problem 1 高级打字机(type.cpp/c/pas)

【题目描述】

早苗入手了最新的高级打字机。最新款自然有着与以往不同的功能,那就是它具备撤销功能,厉害吧。

请为这种高级打字机设计一个程序,支持如下3种操作:

1.T x:在文章末尾打下一个小写字母x。(type操作)

2.U x:撤销最后的x次修改操作。(Undo操作)

(注意Query操作并不算修改操作)

3.Q x:询问当前文章中第x个字母并输出。(Query操作)

文章一开始可以视为空串。

 

【输入格式】

第1行:一个整数n,表示操作数量。

以下n行,每行一个命令。保证输入的命令合法。

 

【输出格式】

每行输出一个字母,表示Query操作的答案。

 

【样例输入】

7

T a

T b

T c

Q 2

U 2

T c

Q 2

【样例输出】

b

c

【数据范围】

对于40%的数据 n<=200;

对于100%的数据 n<=100000;保证Undo操作不会撤销Undo操作。

<高级挑战>

对于200%的数据 n<=100000;Undo操作可以撤销Undo操作。

<IOI挑战>

必须使用在线算法完成该题。

 

弱鸡只能过undo不能撤销undo的,据闻高级挑战正确解法是字典树然后搞树上倍增……

下附模拟代码

 1 #include <algorithm>
 2 #include <iostream>
 3 #include <fstream>
 4 #include <cstdlib>
 5 #include <cstring>
 6 #include <string>
 7 #include <cmath>
 8 using namespace std;
 9 ifstream fin("type.in");
10 ofstream fout("type.out");
11 char xl[1000005];
12 int zx=1;
13 void add(char z);//tybe
14 void cx(int hs);//undo
15 int main(void)
16 {
17  char cz,zm;
18  int gs=0,zls=0;
19  fin>>zls;
20  for(int i=1;i<=zls;i++)
21  {
22   if(zx<0)zx=0;
23   fin>>cz;
24   if(cz=='T')fin>>zm;
25   else fin>>gs;
26   if(cz=='T')add(zm);
27   if(cz=='U')cx(gs);
28   if(cz=='Q')fout<<xl[gs]<<"\n";
29   gs=0;
30  }
31  return 0;
32 }
33 
34 void add(char z)
35 {
36  xl[zx]=z;
37  zx++;
38  return;
39 }
40 
41 void cx(int hs)
42 {
43  zx-=hs;
44  return;
45 }

 

 posted on 2015-09-17 17:34  SakuLeaF  阅读(440)  评论(1编辑  收藏  举报