题意:一个模拟……大概就是模拟一个编辑文档的过程……具体的还是读题吧……

解法:刚开场就发现的一个模拟……果断敲起来……

要注意几点与实际编辑过程不同:

1.当用C操作标记一段字符后,只有D会改变这段字符,其他操作例如V或输入字符都不会改变这段字符,只会取消标记状态,在当前光标位置进行操作。

2.在替换模式下,V操作会进行替换粘贴,与传统编辑模式不同。

3.如果输入操作或者V操作进行后就会超过文档长度,那么就不进行操作。

大概就这些吧……模拟的过程和按题里说的写就没问题……C的处理麻烦一些,但是题目已经给出了解决方案……

代码:

#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string>
#include<string.h>
#include<math.h>
#include<limits.h>
#include<time.h>
#include<stdlib.h>
#include<map>
#include<queue>
#include<set>
#include<stack>
#include<vector>
#define LL long long
using namespace std;
int main()
{
int T;
scanf("%d", &T);
while(T--)
{
int m;//文本最大长度
scanf("%d", &m);
string s;//输入序列
cin >> s;
string txt;//文本
int len = s.size();
int istatus = 0, cstatus = 0;//输入状态:0插入,1替换;复制状态:0nothing,1start
int now = 0, cp;//now当前光标位置,cp是copy position 1
string cb;//剪贴板
for(int i = 0; i < len; i++)
{
if(s[i] >= 'a' && s[i] <= 'z')
{
if(cstatus) cstatus = 0;
if(istatus == 0 && txt.size() < m)
txt.insert(txt.begin() + now++, s[i]);
else if(istatus == 1)
{
if(now < txt.size()) txt[now++] = s[i];
else if(txt.size() < m) txt.insert(txt.begin() + now++, s[i]); }
}
if(s[i] == 'L')
{
if(now) now--;
}
if(s[i] == 'R')
{
if(now != txt.size()) now++;
}
if(s[i] == 'S')
{
if(cstatus) cstatus = 0;
istatus = !istatus;
}
if(s[i] == 'D')
{
if(cstatus)
{
int minp = min(now, cp), maxp = max(now, cp);
cstatus = 0;
txt.erase(txt.begin() + minp, txt.begin() + maxp);
now = minp;
}
else
{
if(txt.size())
{
if(now != txt.size())
{
txt.erase(txt.begin() + now);
}
}
}
}
if(s[i] == 'B')
{
if(cstatus) cstatus = 0;
if(now)
{
txt.erase(txt.begin() + --now);
}
}
if(s[i] == 'C')
{
if(cstatus)
{
int minp = min(now, cp), maxp = max(now, cp);
cstatus = 0;
cb.clear();
cb.insert(cb.begin(), txt.begin() + minp, txt.begin() + maxp);
}
else
{
cstatus = 1;
cp = now;
}
}
if(s[i] == 'V')
{
if(cstatus) cstatus = 0;
if(istatus == 0)
{
if(txt.size() + cb.size() <= m)
{
txt.insert(now, cb);
now += cb.size();
}
}
else
{
if(m - now >= cb.size())
{
txt.erase(txt.begin() + now, txt.begin() + min(now + cb.size(), txt.size()));
txt.insert(txt.begin() + now, cb.begin(), cb.end());
now += cb.size();
}
}
}
}
if(txt.size())
cout << txt << endl;
else
puts("NOTHING");
}
return 0;
}

  

hihocoder 1228 Mission Impossible 6的更多相关文章

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

    #1228 : Mission Impossible 6 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 You must have seen the very famou ...

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

    题目链接: #1228 : Mission Impossible 6 解题思路: 认真读题,细心模拟,注意细节,就没有什么咯!写这个题解就是想记录一下rope的用法,以后忘记方便复习. rope(块状 ...

  3. Mission Impossible 6

    题目:Mission Impossible 6 题目链接:http://hihocoder.com/problemset/problem/1228 题目大意: 大概就是让我们写一个代码模拟文本编辑器的 ...

  4. hdu 3272 Mission Impossible

    Mission Impossible Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Other ...

  5. 2015北京网络赛B题 Mission Impossible 6

    借用大牛的一张图片:模拟 #include<cstdio> #include<cmath> #include<cstring> #include<algori ...

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

    题意:模拟文本操作 思路:模拟 #include<iostream> #include<stdio.h> #include<string.h> using name ...

  7. ACM计算几何题目推荐

    //第一期 计算几何题的特点与做题要领: 1.大部分不会很难,少部分题目思路很巧妙 2.做计算几何题目,模板很重要,模板必须高度可靠. 3.要注意代码的组织,因为计算几何的题目很容易上两百行代码,里面 ...

  8. 五、Pandas玩转数据

    Series的简单运算 import numpy as np import pandas as pd s1=pd.Series([1,2,3],index=['A','B','C']) print(s ...

  9. 华为5G空口新技术(2015年)

    2015-03-24 长江后浪推前浪,4G建设方兴未艾,业界关于5G的讨论已如火如荼.对于每一代移动通信,空口技术都相当于王冠上的明珠. 在月初的世界移动通信大会上,华为发布了面向5G的新空口,并展出 ...

随机推荐

  1. tornado解析http body的过程分析

    tornado解析http body的过程分析 在最近写的一个RESTful API Server过程中,发现tornaod对解析POST BODY的内容有限制. 而在以前用web.py则没有这个限制 ...

  2. Boost简介

    原文链接:  吴豆豆http://www.cnblogs.com/gdutbean/archive/2012/03/30/2425201.html Boost库 Boost库是为C++语言标准库提供扩 ...

  3. Oracle 9 - redo和undo

    1.redo redo 有在线redo日志和归档redo日志, 从Oracle 10g开始还新增加了flashback技术. 每个Oracle数据库至少有2个在线重做日志组,循环写. 只有INSERT ...

  4. java二维码生成与解析代码实现

    TwoDimensionCode类:二维码操作核心类 package qrcode; import java.awt.Color; import java.awt.Graphics2D; import ...

  5. .net与linux

    Mono是什么? http://blog.sina.com.cn/s/blog_693ffe760100k5uh.html Mono是一个开放源代码,Linux版的Microsfot.NET开发平台 ...

  6. SQLServer中服务器角色和数据库角色权限详解

    角色 当几个用户需要在某个特定的数据库中执行类似的动作时(这里没有相应的Windows用户组),就可以向该数据库中添加一个角色(role).数据库角色指定了可以访问相同数据库对象的一组数据库用户. 数 ...

  7. PowerDesigner概念模型的Notation设置

    原文:PowerDesigner概念模型的Notation设置 在进行数据库设计模型时,分为概念模型设计和物理模型设计两种,概念模型主要是反映真是 世界中的业务关系,也就是我们常用的实体关系图.物理模 ...

  8. 修改linux终端命令行颜色

    进入修改:vim /root/.bashrc 1.PS1 要修改linux终端命令行颜色,我们需要用到PS1,PS1是Linux终端用户的一个环境变量,用来说明命令行提示符的设置.在终端输入命令:#s ...

  9. UPC 2224 / “浪潮杯”山东省第四届ACM大学生程序设计竞赛 1008 Boring Counting 主席树

    Problem H:Boring Counting Time Limit : 6000/3000ms (Java/Other)   Memory Limit : 65535/32768K (Java/ ...

  10. OSI七层协议