hiho Mission Impossible 6(模拟 未提交验证。。)

题意:模拟文本操作

思路:模拟

#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;

#define MAXN 10005
int M;
char cmd[MAXN];
char str1[MAXN],str2[MAXN];
char copyStr[MAXN];

void f(){
    int i,j,k,len,len1,len2,lencp;
    len=strlen(cmd);//命令长度
    len1=len2=0;//文本长度
    lencp=0;//剪贴板长度
    int pos=0;//光标位置
    int mode=0;//0 "insert mode",1 "overwrite mode"
    int copyState=0;//0 "NOTHING",1 "START"
    int copyPosition1,copyPosition2;
    for(i=0;i<len;++i){
        if(cmd[i]>='a'&&cmd[i]<='z'){
            if(copyState==1)copyState=0;
            if(len1<M){
                if(pos==len1){
                    str1[len1++]=cmd[i];
                    str1[len1]='\0';
                    ++pos;
                }
                else{
                    if(mode==0){
                        for(j=k=0;j<pos;++j)str2[k++]=str1[j];
                        str2[k++]=cmd[i];
                        for(j=pos;j<len1;++j)str2[k++]=str1[j];
                        str2[k]='\0';
                        strcpy(str1,str2);
                        ++len1;
                        ++pos;
                        //cout<<len1<<endl;
                        //cout<<str1[0]<<endl;
                    }
                    else{
                        for(j=k=0;j<pos;++j)str2[k++]=str1[j];
                        str2[k++]=cmd[i];
                        for(j=pos+1;j<len1;++j)str2[k++]=str1[j];
                        str2[k]='\0';
                        strcpy(str1,str2);
                        ++pos;
                    }
                }
            }
        }
        else if(cmd[i]=='L'){
            if(pos>0)--pos;
        }
        else if(cmd[i]=='R'){
            if(pos<len1)++pos;
        }
        else if(cmd[i]=='S'){
            if(copyState==1)copyState=0;
            if(mode==0)mode=1;//变为重写
            else mode=0;//变为插入
        }
        else if(cmd[i]=='D'){
            if(copyState==1){
                copyState=0;
                copyPosition2=pos;
                if(copyPosition1<copyPosition2){
                    for(j=k=0;j<copyPosition1;++j)str2[k++]=str1[j];
                    for(j=copyPosition2;j<len1;++j)str2[k++]=str1[j];
                    str2[k++]='\0';
                    strcpy(str1,str2);
                    len1=len1-(copyPosition2-copyPosition1);
                }
                else{
                    for(j=k=0;j<copyPosition2;++j)str2[k++]=str1[j];
                    for(j=copyPosition1;j<len1;++j)str2[k++]=str1[j];
                    str2[k]='\0';
                    strcpy(str1,str2);
                    len1=len1-(copyPosition1-copyPosition2);
                }
            }
            else{
                if(pos<len1){
                    for(j=k=0;j<pos;++j)str2[k++]=str1[j];
                    for(j=pos+1;j<len1;++j)str2[k++]=str1[j];
                    str2[k]='\0';
                    strcpy(str1,str2);
                    --len1;
                }
            }
        }
        else if(cmd[i]=='B'){
            if(copyState==1)copyState=0;
            if(pos>0){
                for(j=k=0;j<pos-1;++j)str2[k++]=str1[j];
                for(j=pos;j<len1;++j)str2[k++]=str1[j];
                str2[k]='\0';
                strcpy(str1,str2);
                --len1;
                --pos;
            }
        }
        else if(cmd[i]=='C'){
            if(copyState==0){
                copyState=1;
                copyPosition1=pos;
            }
            else{
                copyState=0;
                copyPosition2=pos;
                if(copyPosition1!=copyPosition2){
                    if(copyPosition1<copyPosition2){
                        for(j=copyPosition1,k=0;j<copyPosition2;++j)
                            copyStr[k++]=str1[j];
                        copyStr[k]='\0';
                        lencp=copyPosition2-copyPosition1;
                    }
                    else{
                        for(j=copyPosition2,k=0;j<copyPosition1;++j)
                            copyStr[k++]=str1[j];
                        copyStr[k]='\0';
                        lencp=copyPosition1-copyPosition2;
                    }
                }
                else{
                    memset(copyStr,'\0',sizeof(copyStr));
                    lencp=0;
                }
            }
        }
        else if(cmd[i]=='V'){
            if(lencp>0){
                if(mode==0){
                    if(len1+lencp<=M){
                        for(j=k=0;j<pos;++j)str2[k++]=str1[j];
                        for(j=0;j<lencp;++j)str2[k++]=copyStr[j];
                        for(j=pos;j<len1;++j)str2[k++]=str1[j];
                        str2[k]='\0';
                        strcpy(str1,str2);
                        len1=len1+lencp;
                        pos=pos+lencp;
                    }
                }
                else{
                    if(pos+lencp<=M){
                        for(j=k=0;j<pos;++j)str2[k++]=str1[j];
                        for(j=0;j<lencp;++j)str2[k++]=copyStr[j];
                        for(j=pos+lencp;j<len1;++j)str2[k++]=str1[j];
                        str2[k]='\0';
                        strcpy(str1,str2);
                        if(pos+lencp>len1)len1=pos+lencp;
                        pos=pos+lencp;
                    }
                }
            }
        }
    }
}

int main(){
    int T;
    scanf("%d",&T);
    while(T--){
        scanf("%d",&M);
        //M=100;
        scanf("%s",cmd);
        f();
        if(str1[0])printf("%s\n",str1);
        else printf("NOTHING\n");
    }
    return 0;
}
View Code

 

posted @ 2015-09-20 20:29  gongpixin  阅读(255)  评论(0编辑  收藏  举报