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
タイトルはいくつかの操作を定義しています: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;
}