题目连接:http://hihocoder.com/problemset/problem/1228
题目大意:请仔细读题。没有什么track,而且没有其他的字符
我是用list模拟的,很好用,主要是这道题数据范围最大就是10000,所以完全不会超时。如果数据量比较大的话用rope会更好。
//#pragma comment(linker,"/STACK:102400000,102400000")
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<math.h>
#include<algorithm>
#include<vector>
#include<map>
#include<set>
#include<queue>
#include<string>
#include<time.h>
#include<stdlib.h>
#include<ctype.h>
#include<ext/rope>
#include<list>
#define PB push_back
#define MP make_pair
#define PF push_front
#define lson k<<1
#define rson k<<1|1
using namespace std;
typedef long long ll;
typedef double db;
typedef long double ldb;
const int N = 10005;
void output(list<char> li)
{
list<char> ::iterator it;
for(it=li.begin();it!=li.end();++it) printf("%c",*it);
printf("\n");
}
char op[N];
int main()
{
#ifdef PKWV
freopen("B.in","r",stdin);
#endif // PKWV
int T;
scanf("%d",&T);
while(T--)
{
int maxsize;
scanf("%d",&maxsize);
scanf("%s",op);
list<char> str;
int mode(0); //0 insert 1 overwrite
int status(0); //0 nothing 1 start
list<char>::iterator pos; // only status==1 pos is valid
int dt; // offset
list<char>::iterator now=str.begin();
list<char> clip;
for(int i=0;op[i];i++)
{
if(islower(op[i]))
{
status=0;
if(mode==0)
{
if(str.size()<maxsize) str.insert(now,op[i]);
}else
{
if(now==str.end())
{
if(str.size()<maxsize) str.insert(now,op[i]);
}else
{
*now=op[i];
++now;
}
}
}else if(op[i]=='L')
{
dt++;
if(now!=str.begin()) --now;
}else if(op[i]=='R')
{
dt--;
if(now!=str.end()) ++now;
}else if(op[i]=='S')
{
status=0;
mode^=1;
}else if(op[i]=='D')
{
if(status)
{
status^=1; //status = 0
if(dt>=0) now=str.erase(now,pos);
else now=str.erase(pos,now);
}else
{
if(now!=str.end()) now=str.erase(now);
}
}else if(op[i]=='C')
{
if(status)
{
status^=1; //status = 0;
list<char> ::iterator st,ed,it;
if(dt>0) st=now,ed=pos;
else st=pos,ed=now;
clip.clear();
for(it=st;it!=ed;++it) clip.push_back(*it);
}else
{
status^=1; // status = 1;
pos=now;
dt=0;
}
}else if(op[i]=='B')
{
status=0;
if(now!=str.begin())
{
--now;
// printf("now : %c\n",*now);
// output(str);
now=str.erase(now);
// output(str);
// if(now==str.end()) printf("now==str.end\n");
// printf("%c ******\n",*now);
}
}else if(op[i]=='V')
{
status=0;
if(mode)
{
int clipsize=clip.size();
list<char> ::iterator it=now;
int cnt(0);
while(it!=str.end()) cnt++,++it;
if(cnt>=clipsize||(str.size()+clipsize-cnt)<=maxsize)
{
for(it=clip.begin();it!=clip.end()&&now!=str.end();++it)
{
*now=*it;
++now;
}
for(;it!=clip.end();++it)
str.insert(now,*it);
}
}else
{
if(str.size()+clip.size()<=maxsize)
{
str.insert(now,clip.begin(),clip.end());
}
}
}
// printf("%d ",i);
// output(str);
}
if(str.size()==0) printf("NOTHING\n");
else
{
for(now=str.begin();now!=str.end();++now) printf("%c",*now);
printf("\n");
}
}
return 0;
}