NC15975 小C的记事本


NC15975 小C的记事本

题目

题目描述

小C最近学会了java小程序的开发,他很开心,于是想做一个简单的记事本程序练练手。

他希望他的记事本包含以下功能:

1、append(str),向记事本插入字符串 str(英文字符)

2、delete(k),删除记事本最后k个字符(保证不为空串)

3、print(k),输出记事本第k个字符(保证不为空串)

4、undo(),撤销最近的1(或者)操作,使记事本回到1(或者2)操作之前的状态

可怜的小C琢磨了半天还是做不来,聪明的你能解决小C的问题吗?

输入描述

多组输入

第一行输入一个整数 /(q/) ,代表操作总数

以下 /(q/) 行每行描述了一个操作,每行以一个整数 /(t/) 开始 /((1 /leq t /leq 4)/)。

/(t/) 表示上述问题陈述中定义的操作类型。 如果操作需要参数,则后跟空格分隔的参数。

题目保证所有操作均合法

/(1 /leq q /leq 10^6/)
$1 /leq k /leq |记事本内容长度| /(
/)每个测试数据中str的总长度 /leq 10^6$

请使用 ios::sync_with_stdio(false); 对读写进行加速

输出描述

所有操作类型3必须输出第 /(k/) 个字符,每行以换行符结束。

示例1

输入

8
1 ab
3 2
2 2
1 cd
3 1
4
4
3 1

输出

b
c
a

说明

样例解释

假设记事本用字符串S表示

1、插入ab,S=”ab”

2、输出第2个字符,是b

3、删除最后2个字符,S=””

4、插入cd, S=”cd”

5、输出第1个字符,是c

6、撤销,此时S=””

7、撤销,此时S=”ab”

8、输出第1个字符,是a

题解

思路

知识点:栈,模拟。

按要求完成操作,而撤销满足先进先出,因此用栈把每步产生的字符串入栈,来完成撤销动作。

时间复杂度 /(O(q)/)

空间复杂度 /(O(q)/)

代码

#include <bits/stdc++.h>

using namespace std;

int main() {
    std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
    int q;
    while (cin >> q) {
        stack<string> s;
        s.push("");
        while (q--) {
            int op;
            cin >> op;
            if (op == 1) {
                string tmp;
                cin >> tmp;
                s.push(s.top() + tmp);
            }
            else if (op == 2) {
                int len;
                cin >> len;
                s.push(s.top().substr(0, s.top().size() - len));
            }
            else if (op == 3) {
                int pos;
                cin >> pos;
                cout << s.top()[pos - 1] << '/n';
            }
            else if (op == 4) s.pop();
        }
    }
    return 0;
}

原创文章,作者:bd101bd101,如若转载,请注明出处:https://blog.ytso.com/270956.html

(0)
上一篇 2022年7月2日
下一篇 2022年7月2日

相关推荐

发表回复

登录后才能评论