#COCR题解 | Word
2025-09-07 14:20:47
发布于:上海
14阅读
0回复
0点赞
作者的话:
我恨模拟。
分析
题目:在 FM 自创的 Word 文档中有几种操作:(略) 每行根据题目描述中的语法执行一次操作。
题目本身很长,但是实际上我们一眼就能看出来这是一道模拟题,按照题目要求做就行了。
可以维护三个变量 ,分别代表当前光标位置、选区左端位置、选区右端位置和剪贴板, 则代表当前没有选中字符。
但是,题目中只保证输入的数据语法正确,因此这道题要关注的处理细节很多,先整理一下每个操作需要执行的内容:
-
键入操作
-
输入待插入的字符 ;
-
判断现在是否有字符被选中:
- 有:清除选区,在 的位置插入 , 移动到 ;
- 无:直接在 的位置插入 并向后移动一位;
-
随后直接取消选择,将 和 设置为 。
-
-
全选操作
-
判断文档是否为空:
- 是:全选不生效,将 和 设置为 ;
- 否:将 设为 (最左边), 设为 (最右边);
-
随后直接将 的位置设置为 (最右边)。
-
-
复制操作
-
判断现在是否有字符被选中:
- 有:将选区内的字串保存到 中。
-
随后直接取消选择,将 和 设置为 。
-
-
粘贴操作
-
判断现在是否有字符被选中:
- 有:清除选区,在 的位置插入 , 移动到 ;
- 无:直接在 的位置插入 并向后移动 位;
-
随后直接取消选择,将 和 设置为 。
-
-
单击操作
-
输入表示单击位置的数字 ;
-
判断 是否合理():
- 合理:直接将 设置为 ;
- 不合理:设置 为 (文档最右位置);
-
随后直接取消选择,将 和 设置为 。
-
-
双击操作
-
输入表示双击位置的数字 ;
-
判断文档是否为空:
- 是:取消选择,将 和 设置为 ,并将 归位到 ;
- 不是:若 i 不合理(),将 设置为 ;若文档为空,则此时 一定是第一个字符,重置为 ;随后将选区左右端点 和 设置为同一个字符 ,将 移动到 i 的位置。
-
这些操作列举清楚之后,这道模拟题就很简单了。
附:本题用到的函数
s.size()
:获取字符串长度;s.erase()
:删除字符串指定区域;s.insert()
:在字符串指定位置插入内容;s.empty()
:判断字符串是否为空(等同于s.size() == 0
);s.substr()
:截取字符串指定区域子串。
代码
#include <iostream>
using namespace std;
int n,i,cur,l = -1,r = -1;
string op,doc,cb,x;
int main(){
cin >> n;
while (n--){
cin >> op;
if (op == "I"){
cin >> x;
if (l != -1){
doc.erase(l,r - l + 1);
doc.insert(l,x);
cur = l + 1;
}else {
doc.insert(cur,x);
cur++;
}
l = r = -1;
}else if (op == "A"){
if (doc.empty()){
l = r = -1;
}else {
l = 0;
r = doc.size() - 1;
}
cur = doc.size();
}else if (op == "C"){
if (l != -1){
cb = doc.substr(l,r - l + 1);
}
l = r = -1;
}else if (op == "V"){
if (l != -1){
doc.erase(l,r - l + 1);
doc.insert(l,cb);
cur = l + cb.size();
}else {
doc.insert(cur,cb);
cur += cb.size();
}
l = r = -1;
}else if (op == "P"){
cin >> i;
if (i < doc.size()){
cur = i;
}else {
cur = doc.size();
}
l = r = -1;
}else if (op == "TP"){
cin >> i;
if (doc.empty()){
l = r = -1;
cur = 0;
}else {
if (i > doc.size()){
i = doc.size();
}
if (doc.empty()){
i = 1;
}
l = r = i - 1;
cur = i;
}
}
}
cout << doc;
return 0;
}
2025 年 09 月 07 日 版本 1
这里空空如也
有帮助,赞一个