哈理工 1418: 编辑器Ⅱ

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
*/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值