没有什么算法,注意各种特殊情况
#include <iostream>
#include <cmath>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <string>
#include <vector>
#include <map>
#include <functional>
#include <cstdlib>
#include <queue>
#include <stack>
using namespace std;
#define For(i,n) for(int i=1;i<=n;i++)
#define Rep(i,n) for(int i=0;i<n;i++)
#define Fork(i,k,n) for(int i=k;i<=n;i++)
#define ForkD(i,k,n) for(int i=n;i>=k;i--)
#define MEM(s) memset(s,0,sizeof(s));
#define MAXN (500000)
#define MAXT (30)
int m;
struct text{
char s[MAXN];
int now; //0..m
bool is_cp,Mode;
int cp1;
char cp[MAXN];
void mem(){ MEM(s) now=0; is_cp=0; Mode=0; cp1=0; MEM(cp) }
void Left() {
if (now) now--;
}
void Right() {
if (s[now+1]!=0) now++;
}
void Switch() {
Mode^=1;
is_cp=0;
}
void Delete() {
if (is_cp) {
is_cp=0;
int cp2=now;
if (cp1^cp2) {
if (cp1>cp2) swap(cp1,cp2);
if (now==cp2) now=cp1;
left_shift(cp2+1,strlen(s+1)+1,cp2-cp1);
}
}
else if (s[now+1]) {
left_shift(now+2,strlen(s+1)+1);
}
}
void Backward() {
if (now) {
left_shift(now+1,strlen(s+1)+1);
now--;
}
is_cp=0;
}
void Copy() {
if (!is_cp) {
is_cp=1;
cp1=now;
}
else {
is_cp=0;
int cp2=now;
if (cp1>cp2) swap(cp1,cp2);
int len=0;
Fork(i,cp1+1,cp2) cp[len++]=s[i];
cp[len]=0;
}
}
void Vpast () {
int len1=strlen(s+1),len2=strlen(cp);
if (!Mode)
{
if (len1+len2>m) return;
right_shift(now+1,len1+1,len2);
Rep(i,len2) {
s[++now]=cp[i];
}
} else {
if (now+len2<=m) {
Rep(i,len2) {
s[++now]=cp[i];
}
}
}
}
void right_shift(int l,int r,int t=1)
{
ForkD(i,l,r) {
s[i+t]=s[i];
}
}
void left_shift(int l,int r,int t=1)
{
Fork(i,l,r) {
s[i-t]=s[i];
}
}
void Print() {
if (s[1])
cout<<(s+1)<<endl;
else cout<<"NOTHING"<<endl;
}
void Put(char ch) {
int len=strlen(s+1);
if (!Mode) {
if (len<m) {
right_shift(now+1,len+1);
s[++now] = ch;
}
}
else {
if (now==len) {
if (len<m) {
s[++now] = ch;
s[now+1] = 0;
}
} else
s[++now] = ch;
}
is_cp=0;
}
}S;
int main() {
freopen("hiho1228.in","r",stdin);
int T;cin>>T;
while(T--) {
S.mem();
scanf("%d ",&m);
while(1) {
char ch=getchar();
if (ch==' '||ch=='\n'||ch==EOF) break;
if ('a'<=ch&&ch<='z') S.Put(ch);
else if (ch=='L') S.Left();
else if (ch=='R') S.Right();
else if (ch=='S') S.Switch();
else if (ch=='B') S.Backward();
else if (ch=='D') S.Delete();
else if (ch=='C') S.Copy();
else if (ch=='V') S.Vpast();
}
S.Print();
}
return 0;
}