hiho 1228 Mission Impossible 6(模擬)

題目大意:就是給一段按鍵操作,進行模擬,輸出最終字符串。各種操作說明見原題點擊打開鏈接


個人覺得用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;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章