題目大意:就是給一段按鍵操作,進行模擬,輸出最終字符串。各種操作說明見原題點擊打開鏈接
個人覺得用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;
}