小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 <bits/stdc++.h>
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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章