2015北京网赛 Mission Impossible 6

题目连接:http://hihocoder.com/problemset/problem/1228

题目大意:请仔细读题。没有什么track,而且没有其他的字符

我是用list模拟的,很好用,主要是这道题数据范围最大就是10000,所以完全不会超时。如果数据量比较大的话用rope会更好。

//#pragma comment(linker,"/STACK:102400000,102400000")
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<math.h>
#include<algorithm>
#include<vector>
#include<map>
#include<set>
#include<queue>
#include<string>
#include<time.h>
#include<stdlib.h>
#include<ctype.h>
#include<ext/rope>
#include<list>
#define PB push_back
#define MP make_pair
#define PF push_front
#define lson k<<1
#define rson k<<1|1
using namespace std;
typedef long long ll;
typedef double db;
typedef long double ldb;

const int N = 10005;

void output(list<char> li)
{
    list<char> ::iterator it;
    for(it=li.begin();it!=li.end();++it) printf("%c",*it);
    printf("\n");
}

char op[N];
int main()
{
#ifdef PKWV
    freopen("B.in","r",stdin);
#endif // PKWV
    int T;
    scanf("%d",&T);
    while(T--)
    {
        int maxsize;
        scanf("%d",&maxsize);
        scanf("%s",op);
        list<char> str;
        int mode(0);   //0 insert  1 overwrite
        int status(0);   //0 nothing  1  start
        list<char>::iterator pos;    // only status==1 pos is valid
        int dt;          // offset 
        list<char>::iterator now=str.begin();
        list<char> clip;
        for(int i=0;op[i];i++)
        {
            if(islower(op[i]))
            {
                status=0;
                if(mode==0)
                {
                    if(str.size()<maxsize) str.insert(now,op[i]);
                }else 
                {
                    if(now==str.end())
                    {
                        if(str.size()<maxsize) str.insert(now,op[i]);
                    }else 
                    {
                        *now=op[i];
                        ++now;
                    }
                }
            }else if(op[i]=='L')
            {
                dt++;
                if(now!=str.begin()) --now;
            }else if(op[i]=='R')
            {
                dt--;
                if(now!=str.end()) ++now;
            }else if(op[i]=='S')
            {
                status=0;
                mode^=1;
            }else if(op[i]=='D')
            {
                if(status)
                {
                    status^=1;  //status = 0
                    if(dt>=0) now=str.erase(now,pos);
                    else now=str.erase(pos,now);
                }else 
                {
                    if(now!=str.end()) now=str.erase(now);
                }
            }else if(op[i]=='C')
            {
                if(status) 
                {
                    status^=1;   //status = 0;
                    list<char> ::iterator st,ed,it;
                    if(dt>0) st=now,ed=pos;
                    else st=pos,ed=now;
                    clip.clear();
                    for(it=st;it!=ed;++it) clip.push_back(*it);
                }else 
                {
                    status^=1;   // status = 1;
                    pos=now;
                    dt=0;
                }
            }else if(op[i]=='B')
            {
                status=0;
                if(now!=str.begin())
                {
                    --now;
//                    printf("now   :   %c\n",*now);
//                    output(str);
                    now=str.erase(now);
//                    output(str);
//                    if(now==str.end()) printf("now==str.end\n");
//                    printf("%c  ******\n",*now);
                }
            }else if(op[i]=='V')
            {
                status=0;
                if(mode)
                {
                    int clipsize=clip.size();
                    list<char> ::iterator it=now;
                    int cnt(0);
                    while(it!=str.end()) cnt++,++it;
                    if(cnt>=clipsize||(str.size()+clipsize-cnt)<=maxsize)
                    {
                        for(it=clip.begin();it!=clip.end()&&now!=str.end();++it)
                        {
                            *now=*it;
                            ++now;
                        }
                        for(;it!=clip.end();++it)
                            str.insert(now,*it);
                    }
                }else 
                {
                    if(str.size()+clip.size()<=maxsize)
                    {
                        str.insert(now,clip.begin(),clip.end());
                    }
                }
            }
//            printf("%d    ",i);
//            output(str);
        }
        if(str.size()==0) printf("NOTHING\n");
        else 
        {
            for(now=str.begin();now!=str.end();++now) printf("%c",*now);
            printf("\n");
        }
    }
    return 0;
}


猜你喜欢

转载自blog.csdn.net/u014076176/article/details/48628033