题意:模拟文本操作
思路:模拟
#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; }
时间: 2024-10-02 20:27:37