求调
  • 板块学术版
  • 楼主AMlhd
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/9/16 12:09
  • 上次更新2024/9/16 16:07:11
查看原帖
求调
576387
AMlhd楼主2024/9/16 12:09

题目系介样的:
KK正在埋头编辑论文,YY只是远远看见KK进行了?次操作,有退格键、删除键、左移、右移、键入字符,请输出编辑后的论文。论文里,?表示光标,有且只有一个光标,退格键(backspace)是删除光标之前的一个符号,删除键(delete)是删除光标之后的一个符号,左移(<-)是将光标移动到左边字符之前去,右移(->)是将光标移动到右边字符之前去。光标左侧没有字符的情况下,退格和左移是无效的。光标右侧没有字符的情况下,删除和右移是无效的。如果键入字符,则会在光标前插入新的字符。 \

输入

第一行两个正整数 ? 和 ?。 ? 代表论文的初始长度。 ?

代表编辑操作次数。

第二行为一个长度为 ? 的字符串,其中仅有1个字符 ? ,其他字符均为大写字母 ?,?和? 。

接下来k行,每行是这几种字符串之一:backspace、delete、<-、->、A、B、C。

输出

共一行,表示编辑后的字符串

#include <bits/stdc++.h>
using namespace std;

int n, k;
string str;
int now;
string op;
int sum = 0;

int main() {
    cin >> n >> k;
    cin >> str;
    sum = n - 1;
    for(int i = 0; i < n; ++i) {
        if(str[i] == 'I') {
            str.erase(i, 1);
            --i;
            now = i + 1;
        }
    }
    // cout << now << endl;
    while(k--) {
        cin >> op;
        if(op == "backspace") {
            str.erase(now, 1);
            --now;
            --sum;
        }
        else if(op == "<-") {
            --now;
        }
        else if(op == "->") {
            ++now;
        }
        else if(op == "delete") {
            --sum;
            str.erase(now + 1, 1);
            --now;
        }
        else {
            str.insert(now, op);
            ++sum;
        }
        for(int i = 0; i < sum; ++i) {
            if(i == now + 1) {
                cout << "I";
            }
            cout << str[i];
        }
    }
    for(int i = 0; i < sum; ++i) {
        if(i == now + 1) {
            cout << "I";
        }
        cout << str[i];
    }
    return 0;
}
2024/9/16 12:09
加载中...