模拟vim (雾
用两个栈s1, s2去模拟,s2的top位置就是光标。这样无论删除还是添加都很方便
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<map>
#include<stack>
#include<queue>
#include<vector>
#include<string>
#include<fstream>
// #include<unordered_map>
using namespace std;
#define rep(i, a, n) for(int i = a; i <= n; ++ i)
#define per(i, a, n) for(int i = n; i >= a; -- i)
#define px first
#define py second
typedef long long ll;
typedef pair<int,int>PII;
const int N = 2e5 + 10;
const ll mod = 998244353;
const double Pi = acos(- 1.0);
const int INF = 0x3f3f3f3f;
const int G = 3, Gi = 332748118;
ll qpow(ll a, ll b) { ll res = 1; while(b){ if(b & 1) res = (res * a) % mod; a = (a * a) % mod; b >>= 1;} return res; }
ll gcd(ll a, ll b) { return b ? gcd(b, a % b) : a; }
//
stack<char> s1,s2;
char t[N];
int num[50];
int main()
{
scanf("%s",t + 1);
int sn = strlen(t + 1);
for(int i = sn; i >= 1; -- i){
s2.push(t[i]);
num[t[i] - 'a'] ++;
}
scanf("%s",t + 1);
int tn = strlen(t + 1);
int l = 1, flag = 0;
for(int i = 1; i <= tn; ++ i){
char op = t[i];
if(flag){ //Insert Mode
if(op == 'e'){
flag = 0;
continue;
}
s1.push(op);
}
else{ // Normal Mode
if(op == 'i'){
flag = 1;
continue;
}
else if(op == 'f' && s2.size()){
op = t[++ i];
if(!num[op - 'a'] || (num[op - 'a'] == 1 && s2.top() == op)) continue;
num[s2.top() - 'a'] --;
s1.push(s2.top()); s2.pop();
while(s2.size() && s2.top() != op){
num[s2.top() - 'a'] --;
s1.push(s2.top()); s2.pop();
}
}
else if(op == 'x' && s2.size()){
num[s2.top() - 'a'] -- , s2.pop();
}
else if(op == 'h' && s1.size()){
num[s1.top() - 'a'] ++;
s2.push(s1.top()), s1.pop();
}
else if(op == 'l' && s2.size()){
num[s2.top() - 'a'] --;
s1.push(s2.top()), s2.pop();
}
}
}
while(s1.size()){
s2.push(s1.top()); s1.pop();
}
while(s2.size()){
printf("%c",s2.top()); s2.pop();
}
printf("
");
return 0;
}