http://222.27.196.8/problem.php?id=1418
大模拟啊,一开始题读的一脸懵逼之后慢慢捋了捋思路发现还是可以做的。关于back的操作要仔细读题,之后就模拟就行了,注意细节。
#include <cstdio>
#include <iostream>
#include <cstring>
#include <string>
#include <cmath>
#include <queue>
#include <stack>
#include <vector>
#include <map>
#include <set>
#include <algorithm>
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
#define mem(a) memset(a, 0, sizeof(a))
#define eps 1e-5
#define INF 0x1f1f1f1f
#define M 100005
using namespace std;
int Case = 1;
int t, n, m;
char s2[10];
char s[105];
struct Xue {
char s[105];
int r, now;
}a[105];
int main()
{
//freopen("data.in", "r", stdin);
//freopen("data.out", "w", stdout);
while(~scanf("%d", &n)) {
a[0].r = 0;
a[0].now = 0;
int pos = 0;
int now = 0;
int r = 0;
int ff = 0; //inser
int flag = 0; //caps
while(n--) {
scanf("%s", s2);
int len = strlen(s2);
if(len == 1) {
if(!ff) {
for(int i = r+1; i >= now+1; i--) {
s[i] = s[i-1];
}
if(!flag) {
s[now] = s2[0]+32;
}
else {
s[now] = s2[0];
}
now++;
r++;
}
else {
if(r == now) {
if(!flag) {
s[now] = s2[0]+32;
}
else {
s[now] = s2[0];
}
now++;
r++;
}
else {
if(!flag) {
s[now] = s2[0]+32;
}
else {
s[now] = s2[0];
}
now++;
}
}
pos++;
for(int i = 0; i < r; i++) {
a[pos].s[i] = s[i];
}
a[pos].r = r;
a[pos].now = now;
}
if(strcmp(s2, "back") == 0) {
if(now == 0) {
continue;
}
for(int i = now; i < r-1; i++) {
s[i] = s[i+1];
}
now--;
r--;
pos++;
for(int i = 0; i < r; i++) {
a[pos].s[i] = s[i];
}
a[pos].r = r;
a[pos].now = now;
}
if(strcmp(s2, "caps") == 0) {
flag = !flag;
}
if(strcmp(s2, "insert") == 0) {
ff = !ff;
}
if(strcmp(s2, "left") == 0) {
if(now > 0) {
now--;
}
}
if(strcmp(s2, "right") == 0) {
if(now < r) {
now++;
}
}
if(strcmp(s2, "ctrlz") == 0) {
if(pos == 0) {
continue;
}
pos--;
for(int i = 0; i < a[pos].r; i++) {
s[i] = a[pos].s[i];
}
r = a[pos].r;
now = a[pos].now;
}
}
s[r] = '\0';
printf("%s\n", s);
}
return 0;
}
/*
10
A
B
C
D
left
insert
X
left
left
caps
ANS:
abcx
*/