codevs 3333 高级打字机
3333 高级打字机
题目描述 Description
早苗入手了最新的高级打字机。最新款自然有着与以往不同的功能,那就是它具备撤销功能,厉害吧。
请为这种高级打字机设计一个程序,支持如下3种操作:
1.T x:在文章末尾打下一个小写字母x。(type操作)
2.U x:撤销最后的x次修改操作。(Undo操作)
(注意Query操作并不算修改操作)
3.Q x:询问当前文章中第x个字母并输出。(Query操作)
文章一开始可以视为空串。
输入描述 Input Description
第1行:一个整数n,表示操作数量。
以下n行,每行一个命令。保证输入的命令合法。
输出描述 Output Description
每行输出一个字母,表示Query操作的答案。
样例输入 Sample Input
7
T a
T b
T c
Q 2
U 2
T c
Q 2
样例输出 Sample Output
b
c
数据范围及提示 Data Size & Hint
对于40%的数据 n<=200;
对于50%的数据 n<=100000;保证Undo操作不会撤销Undo操作。
<高级挑战>
对于100%的数据 n<=100000;Undo操作可以撤销Undo操作。
栈模拟得50分,不知道为什么输入两个字符串对不了
#include<iostream> #include<cstdio> using namespace std; #define maxn 100010 int top,n; char a[maxn],op[4],is[4]; int main(){ scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%s%s",op,is); if(op[0]=='T')a[++top]=is[0]; if(op[0]=='U')top-=is[0]-'0'; if(op[0]=='Q')cout<<a[is[0]-'0']<<endl; } return 0; }
#include<iostream> #include<cstdio> using namespace std; #define maxn 100010 int top,n; char a[maxn],op[4],is[4]; int main(){ scanf("%d",&n); for(int i=1, x;i<=n;i++){ scanf ("%s", op); if(op[0]=='T'){ scanf ("%s",is); a[++top]=is[0]; } if(op[0]=='U'){ scanf ("%d",&x); top-=x; } if(op[0]=='Q'){ scanf ("%d",&x); cout<<a[x]<<endl; } } return 0; }