题目大意:就是给一段按键操作,进行模拟,输出最终字符串。各种操作说明见原题点击打开链接
个人觉得用vector来模拟还是比较方便的。
主要注意一下指针pos的位置就好了,pos是指向当前要插入字符的位置,也即相当于光标的右边。对于D操作删除的时候删除光标的右边字符,即pos位置,对于B操作,删除的是左边的字符,即pos-1的位置。
然后是粘贴的时候,分为插入模式和覆盖模式考虑。对于插入模式,需要考虑的是:复制的文本长度+当前文本长度<=M时,将复制的文本插入当前pos位置;对于覆盖模式,当复制的文本+当前pos<=M时粘贴就好了。注意,如果>M,则需要忽略此次粘贴操作。
再一个就是按下C之后,进行的删除操作:用了两个变量pos1和pos2来记录要删除两个端点位置(pos1<pos2),即要删除的文本下标为[pos1,pos2),注意是前闭后开区间。
然后注意调用erase的时候删除的始终是vector.begin()+pos1的字符,即删除pos2-pos1次。
还有要注意的是粘贴的时候光标也会移动。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<map>
#include<vector>
using namespace std;
char s[10005];
vector<char> text,copy_text;
vector<char>::iterator it;
void output()
{
if((int)text.size()==0) printf("NOTHING");
for(it=text.begin();it!=text.end();++it) cout<<*it;
cout<<endl;
}
int main()
{
int i,T,M;
cin>>T;
while(T--)
{
scanf("%d%s",&M,s);
text.clear();
copy_text.clear();
int l=strlen(s),pos=0,copy_pos1,copy_pos2;
bool flag_insert=1,flag_copy=0;
for(i=0;i<l;++i)
{
if(s[i]=='L'){
if(pos>0) --pos;
}
else if(s[i]=='R'){
if(pos<(int)text.size()) ++pos;
}
else if(s[i]=='S'){
flag_insert=!flag_insert;
flag_copy=0;
}
else if(s[i]=='B'){
flag_copy=0;
if(pos==0) continue;
--pos;
text.erase(text.begin()+pos);
}
else if(s[i]=='D'){
if(flag_copy){
copy_pos2=pos;
if(copy_pos1!=copy_pos2)
{
if(copy_pos1>copy_pos2) swap(copy_pos1,copy_pos2);
for(int j=copy_pos1;j<copy_pos2;++j) text.erase(text.begin()+copy_pos1);
}
flag_copy=0;
}
else{
if(pos<(int)text.size()) text.erase(text.begin()+pos);
}
}
else if(s[i]=='C'){
if(flag_copy){
copy_pos2=pos;
copy_text.clear();
if(copy_pos1!=copy_pos2)
{
if(copy_pos1>copy_pos2) swap(copy_pos1,copy_pos2);
for(int j=copy_pos1;j<copy_pos2;++j) copy_text.push_back(text[j]);
}
flag_copy=0;
}
else{
copy_pos1=pos;
flag_copy=1;
}
}
else if(s[i]=='V'){
flag_copy=0;
if(flag_insert)
{
if((int)copy_text.size()!=0&&(int)copy_text.size()+(int)text.size()<=M)
{
int j;
for(j=0;j<(int)copy_text.size();++j) text.insert(text.begin()+j+pos,copy_text[j]);
pos+=j;
}
}
else{
if((int)copy_text.size()!=0&&(int)copy_text.size()+pos<=M)
{
int j;
for(j=0;j<(int)copy_text.size();++j)
{
if(j+pos<(int)text.size()) text.erase(text.begin()+j+pos);
text.insert(text.begin()+j+pos,copy_text[j]);
}
pos+=j;
}
}
}
else if(s[i]>='a'&&s[i]<='z'){
flag_copy=0;
if(flag_insert)
{
if((int)text.size()<M){
text.insert(text.begin()+pos,s[i]);
++pos;
}
}
else{
if(pos==(int)text.size()){
if((int)text.size()<M){
text.insert(text.begin()+pos,s[i]);
++pos;
}
}
else{
text.erase(text.begin()+pos);
text.insert(text.begin()+pos,s[i]);
++pos;
}
}
}
}
output();
}
return 0;
}