小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;
}