hihocoder 1228 Mission Impossible 6(アナログテキストエディタ)


タイトル:
タイトルはいくつかの操作を定義しています:L:カーソルを左に移動して、もしすでに一番左にあるならばR:カーソルを右に移動しないで、もしすでに右にあるならばS:モードを切り替えて、先にモードを挿入して、それからカバーモードD:右を削除して、あるいは位置C-Dを削除しますB:左を削除します:位置C-Cをコピーします.また、2つのCCの間にL,R以外の文字V:ペーストが存在することができず、上書きモードであれば現在のカットボードの内容を現在のカーソルの位置から上書きし、挿入モードであればカットボードの内容をカーソルに挿入する.注:テキストの上限を超えた場合は、アクションは実行されません.CのstartingモードではL,R以外のどの操作でもstartingはnothingになります.
解析:
题意通りに模拟したんだよ、クソ试合の时、stringのeraseの方法を书き间违えて、中に直接住所を伝えて、后ろの长さを忘れて、ずっとWAで、见えない.
my code
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cstdlib>
#include <string>
using namespace std;

string edit, buf, cmd;
int limit;

int position;
// signal position

int modeType; 
// 0 insert
// 1 overWrite 

int copyType, copyPos;
// copyType = 0 nothing
// copyType = 1 start

void move(char ch) {
    if(ch == 'L') {
        if (position > 0) position--;
    }
    if(ch == 'R') {
        if(position < edit.length()) position++;
    }
}

inline void switchMode() { modeType ^= 1; }

void copyOper() {
    int from, len;
    if(copyType == 0) {
        copyPos = position;
        copyType = 1;
    }else {
        copyType = 0;
        from = min(copyPos, position);
        len = abs(copyPos - position);
        buf = edit.substr(from, len);
    }
}

void backSpace() {
    copyType = 0;
    if(position == 0) return ;
    position--;
    edit.erase(position, 1);
}

void Delete() {
    int len, from;
    if(copyType == 1) {
        len = abs(copyPos - position);
        from = min(position, copyPos);
        edit.erase(from, len);
    }else {
        if (position < edit.length())
            edit.erase(position, 1);
    }
}

void addEdit(char ch) {
    if(modeType == 0) {
        if(edit.length() >= limit) return ;
        edit.insert(position, 1, ch);
        position++;
    }else if(modeType == 1) {
        if(position >= edit.length()) {
            if (edit.length() < limit) {
                edit += ch;
                position++;
            }
        }else {
            edit[position] = ch;
            position++;
        }
    }
}

void paste() {
    if(buf.length() == 0) return ;
    if(modeType == 0) {
        if(edit.length() + buf.length() > limit) return ;
        edit.insert(position, buf);
        position += buf.length();
    }else if(modeType == 1) {
        if(position + buf.length() > limit) return ;
        edit.replace(position, buf.length(), buf);
        position += buf.length();
    }
}

void init() {
    position = copyPos = copyType = modeType = 0;
    edit = buf = cmd = "";
}

void doit(char ch) {
    if(ch == 'L' || ch == 'R') {
        move(ch);
    }else if(ch == 'S') {
        switchMode();
        copyType = 0;
    }else if(ch == 'B') {
        backSpace();
        copyType = 0;
    }else if(ch == 'D') {
        Delete();
        copyType = 0;
    }else if(ch == 'C') {
        copyOper();
    }else if(ch == 'V') {
        paste();
        copyType = 0;
    }else if (ch >= 'a' && ch <= 'z'){
        addEdit(ch);
        copyType = 0;
    }
}

int main() {
    int T;
    cin >> T;
    while(T--) {
        init();
        cin >> limit >> cmd;
        for(int i = 0; i < cmd.length(); i++) {
            doit(cmd[i]);
        }
        puts(edit.length() == 0 ? "NOTHING" : edit.c_str());
    }
    return 0;
}