Description
早苗入手了最新的高级打字机。最新款自然有着与以往不同的功能,那就是它具备撤销功能,厉害吧。
请为这种高级打字机设计一个程序,支持如下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
扫描二维码关注公众号,回复:
2128398 查看本文章
对于40%的数据 n<=200;
对于100%的数据 n<=100000;保证Undo操作不会撤销Undo操作。
<高级挑战>
对于200%的数据 n<=100000;Undo操作可以撤销Undo操作。
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<cmath>
#define SS 12003
using namespace std;
struct pp
{
char a[18003]=" ";
}k[12005];
int n;
char p;
int i;
long s;
int main()
{
//freopen("a.out","w",stdout);
scanf("%d",&n);
for(int tot=1;tot<=n;tot++)
{
cin>>p;
switch(p)
{
case 'T':
i++;
memcpy(k[i%SS].a,k[(i-1)%SS].a,sizeof(k[i%SS].a));
cin>>k[i%SS].a[strlen(k[i%SS].a)];
break;
case'U':scanf("%ld",&s);
i++;
memcpy(k[i%SS].a,k[(i-s-1)%SS].a,sizeof(k[i%SS].a));
break;
case 'Q':scanf("%ld",&s);
cout<<k[i%SS].a[s]<<endl;
}
}
}