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;
}


你可能感兴趣的:(hiho 1228 Mission Impossible 6(模拟))