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