• 高级打字机


    高级打字机

    题目描述:
    早苗入手了最新的高级打字机。最新款自然有着与以往不同的功能,那就是它具备撤销功能,厉害吧。
    请为这种高级打字机设计一个程序,支持如下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[N];
    int ToT,root[N/2],len[N/2],ls[N],rs[N];
    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
    ",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;
    }
  • 相关阅读:
    三元组数据结构
    线性表的顺序表示和实现 数据结构
    【欧拉计划1】Multiples of 3 and 5
    strcmp()与strcmpi()函数 C语言
    指向函数的指针 C语言
    const限定符声明 C语言
    Java环境搭建与配置
    栈的C语言实现
    【欧拉计划2】Even Fibonacci numbers
    单链表的表示和实现 数据结构
  • 原文地址:https://www.cnblogs.com/cax1165/p/6071003.html
Copyright © 2020-2023  润新知