高级打字机
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; }
相关文章推荐
- 高级打字机
- 2014-3-15-高级打字机type(可持久化线段树)
- 高级打字机 (Tries)
- codevs 3333 高级打字机
- [模拟赛] T1 高级打字机
- 高级打字机
- C++之路进阶——codevs3333(高级打字机)
- 洛谷 P1383 codevs 3333 高级打字机
- 2012-10-20 NOIP模拟赛“高级打字机”O(n)离线算法
- 洛谷 P1383 高级打字机==codevs 3333 高级打字机
- (luogu P1383)高级打字机
- 【高级打字机-给你一个主席树】
- Bzoj 3333 高级打字机(主席树)
- [JZOJ 3794]. 【NOIP2014模拟8.20】高级打字机
- codevs 3333 高级打字机
- Windows高级编程之线程调度、优先级和亲缘性
- C#高级程序设计(七)——迭代
- 《Java核心技术 卷II 高级特性(原书第9版)》
- mysql操作--高级
- [Android Studio 权威教程]断点调试和高级调试