hihocoder 1228 Mission Impossible 6

时间:2022-07-18 22:53:21

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

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

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

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