小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 <= t <= 4)。

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

题目保证所有操作均合法

1 <= q <= 10^6
1 <= k <= |记事本内容长度|
每个测试数据中str的总长度 <= 10^6

请使用 ios::sync_with_stdio(false); 对读写进行加速
输出描述:
所有操作类型3必须输出第k个字符,每行以换行符结束。

思路:就是有关栈的应用,用栈来存着撤销操作。
详细见代码

#pragma GCC target("avx,sse2,sse3,sse4,popcnt")
#pragma GCC optimize("O2,O3,Ofast,inline,unroll-all-loops,-ffast-math")
#include 
using namespace std;
#define js ios::sync_with_stdio(false);cin.tie(0); cout.tie(0)
typedef long long ll; typedef unsigned long long ull; typedef long double ld;
const ll MOD = 1e9 + 7;
inline ll read() { ll s = 0, w = 1; char ch = getchar(); while (ch < 48 || ch > 57) { if (ch == '-') w = -1; ch = getchar(); }    while (ch >= 48 && ch <= 57) s = (s << 1) + (s << 3) + (ch ^ 48), ch = getchar();    return s * w; }
inline void write(ll x) { if (!x) { putchar('0'); return; } char F[40]; ll tmp = x > 0 ? x : -x; if (x < 0)putchar('-');    int cnt = 0;    while (tmp > 0) { F[cnt++] = tmp % 10 + '0';        tmp /= 10; }    while (cnt > 0)putchar(F[--cnt]); }
inline ll gcd(ll x, ll y) { return y ? gcd(y, x % y) : x; }
ll qpow(ll a, ll b) { ll ans = 1;    while (b) { if (b & 1)    ans *= a;        b >>= 1;        a *= a; }    return ans; }    ll qpow(ll a, ll b, ll mod) { ll ans = 1; while (b) { if (b & 1)(ans *= a) %= mod; b >>= 1; (a *= a) %= mod; }return ans % mod; }
inline int lowbit(int x) { return x & (-x); }

const int N = 1e6 + 7;
int a[N], b[N];
stack<string> st;

string s;

int main(){
    js;
    int n;
    int t;
    while(cin>>t){
        while(!st.empty()) st.pop();
        st.push("");
        while(t--){
        int n;
        cin>>n;
        if(n==1){
            cin>>s;
            st.push(st.top()+s);
        }
        if(n==2){
            int k;
            cin>>k;
            s = st.top();
            s = s.erase(s.size()-k,s.size());
            st.push(s);
        }
        if(n==3){
            int k;
            cin>>k;
            s = st.top();
            cout<<s[k-1]<<endl;
        }
        if(n==4){
            st.pop();
        }
        }
    }
    return 0;
}

你可能感兴趣的:(c,c++)