Hihocoder 1228 Mission Impossible 6

#include<bits/stdc++.h>
#define MAXM 10005

using namespace std;

int t,m;
int ope_num;
bool mode;
bool copy_status;
int copy_pos1;
string s;
string clip;
string board;

int caret_pos;

//---------------------------------------------
void init()
{
    ope_num = s.size();
    board.clear();
    clip.clear();
    caret_pos = 0;
    mode = 0;//0 insert 1 overwrite
    copy_status = 0;//0 nothing 1 start
}

//---------------------------------------------
int main()
{
//freopen("data.txt","r",stdin);
    scanf("%d",&t);

    while(t--)
    {
        scanf("%d",&m);
        cin>>s;
        init();

        for(int step=0;step<ope_num;step++)
        {
            if(s[step] == 'L')
            {
                if(caret_pos > 0) caret_pos--;
            }
            else if(s[step] == 'R')
            {
                if(caret_pos < board.size()) caret_pos++;
            }
            else if(s[step] == 'S')
            {
                if(copy_status == 1)
                {
                    copy_status = 0;
                }

                mode = !mode;
            }
            else if(s[step] == 'D')
            {
                if(copy_status == 1)
                {
                    copy_status = 0;

                    board.erase(min(caret_pos,copy_pos1),abs(caret_pos - copy_pos1));
                    caret_pos = min(caret_pos,copy_pos1);
                }
                else
                {
                    if(caret_pos < board.size())
                        board.erase(caret_pos,1);
                }
            }
            else if(s[step] == 'B')
            {
                if(copy_status == 1)
                {
                    copy_status = 0;
                }

                if(caret_pos > 0)
                {
                    board.erase(caret_pos-1,1);
                    caret_pos--;
                }
            }
            else if(s[step] == 'C')
            {
                if(copy_status == 0)
                {
                    copy_status = 1;
                    copy_pos1 = caret_pos;
                }
                else
                {
                    copy_status = 0;
                    clip.clear();
                    clip = board.substr(min(caret_pos,copy_pos1),abs(caret_pos - copy_pos1));
                }
            }
            else if(s[step] == 'V')
            {
                if(copy_status == 1)
                {
                    copy_status = 0;
                }
                if( clip.size()==0 )   continue;
                if(mode == 0)
                {
                    if(board.size() + clip.size() > m) continue;
                    board.insert(caret_pos,clip);
                }
                else
                {
                    if(caret_pos + clip.size() > m) continue;
                    board.replace(caret_pos,clip.size(),clip);
                }
                caret_pos += clip.size();
            }
            else if(s[step]>='a' && s[step]<='z')
            {
                if(copy_status == 1)
                {
                    copy_status = 0;
                }

                if(!(mode == 1 && caret_pos < board.size()))
                {
                    if(board.size() >= m) continue;
                }

                if(caret_pos < board.size())
                {
                    if(mode == 0)
                        board.insert(caret_pos,1,s[step]);
                    else
                        board[caret_pos] = s[step];
                }
                else
                {
                    board.append(1,s[step]);
                }
                caret_pos++;
            }

            //cout<<s[step]<<'%'<<endl;
            //cout<<board<<endl;
            //cout<<clip<<endl;
            //cout<<caret_pos<<' '<<copy_pos1<<endl;
        }

        if(board.size() == 0)
            cout<<"NOTHING\n";
        else
            cout<<board<<'\n';
    }

    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值