纯模拟。。赛前恰好看到神奇的rope!上去直接就用了,不过后来听说没有超时的问题sting都可以过。。
#include <bits/stdc++.h>
#include <ext/rope>
using namespace std;
using namespace __gnu_cxx;
int m;
char s[10010];
struct Line{
rope<char> str;
int mode; // 0:insert 1:overwrite
int now;
int copyStatus; // 0: nothing 1 :start
int cp1; // copy postion1
string clip;
void init(){
str.clear();
copyStatus = mode = now = 0;
clip = "";
}
void add(char c){
int len = str.size();
if(mode == 0){
if(len == m) return;
str.insert(now,c);
now++;
}else{
if(len == m && now == len) return;
str.replace(now,c);
now++;
}
}
void left(){
if(now>0) now--;
}
void right(){
if(now<str.size()) now++;
}
void change(){
if(copyStatus == 1) copyStatus = 0;
mode = !mode;
}
void delD(){
if(copyStatus == 1){
int t1 = min(now,cp1), t2 = max(now,cp1);
str.erase(t1,t2-t1);
copyStatus = 0;
now = t1;
}
else if(now < str.size()){
str.erase(now,1);
}
//output();
//cout << copyStatus <<endl;
}
void delB(){
//output();
if(copyStatus == 1) copyStatus = 0;
if(now > 0 ){
//cout << str[now-1] << endl;
str.erase(now-1,1);
//output();
now--;
}
}
void copy(){
if(copyStatus == 0){
copyStatus = 1;
cp1 = now;
}else{
copyStatus = 0;
if(now == cp1) clip = "";
else{
int t1 = min(now,cp1), t2 = max(now,cp1);
clip = "";
for(int i=t1;i<t2;i++){
clip += str[i];
}
}
}
}
void paste(){
//output();
if(clip=="") return;
// for (int i = 0; i < clip.size(); i++) {
// cout << clip[i] << endl;
// }
// cout << "!" << endl;
// cout << clip << " " << clip.size() << endl;
int len = clip.size();
//cout <<"len: " << str.size() <<" " << len << endl;
if(mode == 0){
if(str.size() + len > m) return;
//cout <<"@@copy:";
for(int i=0;i<len;i++){
str.insert(now++,clip[i]);
//cout << clip[i] ;
}
//cout << endl;
}else{
if(now + len > m) return;
//cout << "xxx" << endl;
for(int i=0;i<len;i++){
str.replace(now++,clip[i]);
}
}
}
void output(){
int len = str.size();
if(len ==0 ) puts("NOTHING");
else{
for(int i=0;i<len;i++){
printf("%c",str[i]);
}
printf("\n");
}
}
};
void solve(){
int len = strlen(s);
Line res;
res.init();
for(int i=0;i<len;i++){
if(s[i] >= 'a' && s[i]<='z') {
if(res.copyStatus == 1) res.copyStatus = 0;
res.add(s[i]);
}
else if(s[i] == 'L') res.left();
else if(s[i] == 'R') res.right();
else if(s[i] == 'S') res.change();
else if(s[i] == 'D') res.delD();
else if(s[i] == 'B') res.delB();
else if(s[i] == 'C') res.copy();
else if(s[i] == 'V') res.paste();
}
res.output();
}
int main(){
int T;
scanf("%d",&T);
while(T--){
scanf("%d",&m);
scanf("%s",s);
solve();
}
return 0;
}