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

时间: 2024-10-02 20:27:37

hiho Mission Impossible 6(模拟 未提交验证。。)的相关文章

Mission Impossible 6

题目:Mission Impossible 6 题目链接:http://hihocoder.com/problemset/problem/1228 题目大意: 大概就是让我们写一个代码模拟文本编辑器的部分功能,要求实现下面的操作功能: 1. 小写字母就是输入 2. L 表示光标左移,R 表示右移,如果超过了当前字符串的范围就忽略 3. S 表示在插入和覆盖之间的转换,如果在插入状态,就在光标右边插入一个字符,如果是覆盖状态,就覆盖右边的一个字符. 4. D 表示删除光标右边的一个字符 5. B

2015 ACM-ICPC国际大学生程序设计竞赛北京赛区网络赛 1002 Mission Impossible 6

题目链接: #1228 : Mission Impossible 6 解题思路: 认真读题,细心模拟,注意细节,就没有什么咯!写这个题解就是想记录一下rope的用法,以后忘记方便复习. rope(块状链表)属于SGI STL的一部分,不属于ISO C++标准库,但libstdc++-v3也包含了扩展,在头文件#include<ext/rope>,using namespace __gnu_cxx命名空间中.可以在很短的时间内实现快速的插入.删除和查找字符串. rope.size()    返回

SQL Server 中的事务与事务隔离级别以及如何理解脏读, 未提交读,不可重复读和幻读产生的过程和原因

原本打算写有关 SSIS Package 中的事务控制过程的,但是发现很多基本的概念还是需要有 SQL Server 事务和事务的隔离级别做基础铺垫.所以花了点时间,把 SQL Server 数据库中的事务概念,ACID 原则,事务中常见的问题,问题造成的原因和事务隔离级别等这些方面的知识好好的整理了一下. 其实有关 SQL Server 中的事务,说实话因为内容太多, 话题太广,稍微力度控制不好就超过了我目前知识能力范围,就不是三言两语能够讲清楚的.所以希望大家能够指出其中总结的不足之处,对我

ACM-ICPC国际大学生程序设计竞赛北京赛区(2015)网络赛 B Mission Impossible 6

#1228 : Mission Impossible 6 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 You must have seen the very famous movie series,"Mission Impossible", from 1 to 4. And "Mission Impossible 5" is now on screen in China. Tom Cruise is just learning pro

js 验证表单 js提交验证类

js 验证表单 js提交验证类 附加:js验证radio是否选择 <script language="javascript">function checkform(obj){for(i=0;i<obj.oo.length;i++)         if(obj.oo[i].checked==true) return true; alert("请选择")return false; }</script><form id="f

曲苑杂坛--DML操作中如何处理那些未提交的数据

对数据库稍有了解的人,数据库使用排他锁X锁来避免两个事务同时修改同一条数据,同时使用较低级别如行上加锁来提高并发度. 以下了两种场景很容易理解: 1>事务1执行 UPDATE TB1 SET C2=1 WHERE C1=1(此处假设C1为主键,使用行锁),事务1未提交,而后事务2执行UPDATE TB1 SET C2=2 WHERE C1=1,事务2必须等到事务1提交或回滚后,才能获得对该行数据的X锁: 2>事务1执行 UPDATE TB1 SET C2=1 WHERE C1=1(此处假设C1

提交验证是否为空-js代码

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-

找出未提交的MySQL线程/事务

找出未提交的MySQL线程/事务: SELECT trx_id,trx_state,trx_started,trx_mysql_thread_id,CURRENT_TIMESTAMP - trx_started AS RUN_TIME from information_schema.innodb_trx; SELECT * from information_schema.processlist;   这个能看到上面哪个SQL线程ID(下图的378号线程就是造成MDL锁的罪魁祸首) SELECT

SQL Server查詢未提交事務,終止進程,解除表鎖

如果數據庫中有未提交的事務,相關表將一直處於死鎖狀態,從而影響其他進程的查詢(除非在查詢中用with (nolock)). 由於事務的隔離性,其他Session無法簡單通過RollBack Transaction來回滾事務,只能終止未提交事務所在會話的進程,然後由於事務的原子性,終止其進程,事務也就回滾了. 如何找出未提交的事務呢 運行如下命令: DBCC OpenTran 結果如下: SPID即進程ID,再運行如下命令,終止進程即可: kill 52 -- 52就是未提交事務會話所在SPID