2018.07.10【2018提高组】模拟C组:高级打字机
题目描述:
早苗入手了最新的高级打字机。最新款自然有着与以往不同的功能,那就是它具备撤销功能,厉害吧。
请为这种高级打字机设计一个程序,支持如下3种操作:
T x:在文章末尾打下一个小写字母x。(type操作)
U x:撤销最后的x次修改操作。(Undo操作)(注意Query操作并不算修改操作)
Q x:询问当前文章中第x个字母并输出。(Query操作)文章一开始可以视为空串。
输入输出:
Input
第1行:一个整数n,表示操作数量。
以下n行,每行一个命令。保证输入的命令合法。
Output
每行输出一个字母,表示Query操作的答案。
Sample Input
7
T a
T b
T c
Q 2
U 2
T c
Q 2
Sample Output
b
c
Data Constraint
对于40%的数据 n<=200;
对于100%的数据 n<=100000;保证Undo操作不会撤销Undo操作。
<高级挑战>
对于200%的数据 n<=100000;Undo操作可以撤销Undo操作。
思路:每做一步记录当前状态,Ux就回到a[i-x-1]的状态
var
a:array[0..20001] of ansistring;
s,ss:ansistring;
i,j,k,n,m,kk:longint;
procedure ww;
var
k,len:longint;
sss:string;
begin
len:=length(ss);
sss:=copy(ss,3,len-2);
val(sss,k);
writeln(a[j mod 20000][k]);
end;
begin
readln(n);
j:=0;
for i:=1 to n do
begin
readln(ss);
if ss[1]='T' then begin
inc(j);
a[j mod 20000]:=a[(j-1) mod 20000]+ss[3];
end;
if ss[1]='U' then begin
inc(j);
delete(ss,1,2);
val(ss,kk);
a[j mod 20000]:=a[(j-kk-1) mod 20000];
end;
if ss[1]='Q' then ww;
end;
end.