您的位置:首页 > 其它

高级打字机

2016-08-05 07:43 162 查看

高级打字机

题目描述:

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

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

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

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

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

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

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

输入描述:

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

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

输出描述 Output Description

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

样例输入:

7

T a

T b

T c

Q 2

U 2

T c

Q 2

样例输出:

b

c

数据范围及提示:

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

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

<高级挑战>

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

#include<cstdio>
using namespace std;
#define N 2000010
char S
;
int ToT,root[N/2],len[N/2],ls
,rs
;
inline int read() {
register int x=0,f=1;
register char ch=getchar();
while(ch>'9'||ch<'0'){if(ch=='-') f=-1;ch=getchar();}
while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
return x*f;
}
void update(int& y,int x,int l,int r,int pos,char c) {
y=++ToT;
if(l==r) S[y]=c;
else{
int mid=l+r>>1;ls[y]=ls[x];rs[y]=rs[x];
if(pos<=mid) update(ls[y],ls[x],l,mid,pos,c);
else update(rs[y],rs[x],mid+1,r,pos,c);
}
}
void query(int y,int l,int r,int pos) {
if(l==r) printf("%c\n",S[y]);
else{
int mid=l+r>>1;
if(pos<=mid) query(ls[y],l,mid,pos);
else query(rs[y],mid+1,r,pos);
}
}
int main() {
int n=read(),vs=0;
while(n--) {
char cmd[2],s[2];
scanf("%s",cmd);
if(cmd[0]=='T') {
scanf("%s",s);vs++;len[vs]=len[vs-1]+1;
update(root[vs],root[vs-1],1,100000,len[vs],s[0]);
}
else if(cmd[0]=='U') {
int x=read();vs++;
root[vs]=root[vs-x-1];
len[vs]=len[vs-x-1];
}
else query(root[vs],1,100000,read());
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: