大模拟一个。。反正这种题比赛的时候都是最后写的,读题一定要仔细,代码逻辑要清晰,最好带注释,我很幸运地在最后10min1A了。。
感觉要特别注意的地方是状态的修改,还有光标的移动,不能超过长度限制等等。最繁琐的地方应该是复制粘贴,把题目每个要求都满足应该就差不多了,其实样例给得已经够良心了。
另外有个意外收获,就是有人怕O(n)的字符串操作TLE,用了rope这个库,有空学习一下!
#include <map>
#include <set>
#include <list>
#include <cmath>
#include <deque>
#include <queue>
#include <stack>
#include <bitset>
#include <cctype>
#include <cstdio>
#include <string>
#include <vector>
#include <complex>
#include <cstdlib>
#include <cstring>
#include <fstream>
#include <sstream>
#include <utility>
#include <iostream>
#include <algorithm>
#include <functional>
#define LL long long
#define INF 0x7fffffff
using namespace std;
string str;
string clipboard;
const int INSERT=0;
const int OVERWRITE=1;
const int NOTHING=0;
const int START=1;
char ans[20010];
int gb; //光标位置
int lineend; //
int mode;
int pos1; //复制开始的位置
int copymode;
void init(){
gb=0;
lineend=0;
mode=INSERT;
pos1=-1;
copymode=NOTHING;
clipboard="";
}
void output(){
if(lineend>0){
ans[lineend]='\0';
/*for(int i=0;i<lineend;i++){
printf("%c",ans[i]);
}*/
printf("%s\n",ans);
}else{
printf("NOTHING\n");
}
}
int main() {
int t;
cin>>t;
while(t--) {
init();
int M;
cin>>M>>str;
int len = str.size();
for(int q=0;q<len;q++){
char op = str[q];
if(op=='L'){
if(gb>0)gb--;
}else if(op=='R'){
if(gb<lineend&&gb<M-1)gb++;
}else if(op=='S'){
mode=!mode;
copymode=NOTHING;
}else if(op=='D'){
if(copymode==START){ //复制的东西就没了。。
copymode=NOTHING;
int s=gb,t=pos1;
if(s>t){
swap(s,t);
}
int dist=t-s;
for(int i=t;i<lineend;i++){
ans[i-dist]=ans[i];
}
lineend-=dist;
gb=s;
}else{
if(gb<lineend){
for(int i=gb;i<lineend;i++){
ans[i]=ans[i+1];
}
lineend--;
}
}
}else if(op=='B'){
copymode=NOTHING;
if(gb>0){
for(int i=gb;i<lineend;i++){
ans[i-1]=ans[i];
}
lineend--;
gb--;
}
}else if(op=='C'){
if(copymode==NOTHING){
pos1=gb;
}else{
int s=gb,t=pos1;
if(s>t){
swap(s,t);
}
clipboard="";
for(int i=s;i<t;i++){
clipboard+=ans[i];
}
}
copymode=!copymode;
}else if(op=='V'){
copymode=NOTHING;
int cliplen=clipboard.size();
if(mode==INSERT){
if(cliplen+lineend<=M){ //不能超长
for(int i=lineend-1;i>=gb;i--){
ans[i+cliplen]=ans[i];
}
for(int i=0;i<cliplen;i++){
ans[i+gb]=clipboard[i];
}
lineend+=cliplen;
gb+=cliplen;
}
}else{
if(cliplen+gb<=M){ //不能超长
for(int i=0;i<cliplen;i++){
ans[i+gb]=clipboard[i];
}
gb+=cliplen;
lineend=max(lineend,gb);
}
}
}else{
copymode=NOTHING;
if(mode==INSERT){ //插入
if(lineend<M){ //没有超过长度
for(int i=lineend;i>gb;i--){
ans[i]=ans[i-1];
}
ans[gb]=op;
lineend++;
gb++;
}else{
}
}else{ //覆盖
ans[gb]=op;
gb++;
if(gb>M){
gb--;
}
lineend=max(lineend,gb);
}
}
//output();
}
output();
}
return 0;
}