P17168 [CEOI 2026] Vim
题目描述
恐怕很难找到比老派的 Vim 更加**极客**的东西了。在这个编辑器中,我们能做到许多在“普通”编辑器里只能想象的事情——当然,前提是愿意投入一周时间学习,再花一个月练习,让那些不同寻常但功能强大的命令成为我们的“肌肉记忆”。和其他编辑器一样,Vim 中也有一个**光标**,它始终位于某个字符上。初始时,光标位于文本的第一个字符上。Vim 中同样还有一个**剪贴板**,用于存储文本片段,并间接用于复制和移动文本。剪贴板初始为空。
本题假定编辑器最初恰好有一个 `-`(减号)字符,目标是最终得到恰好 $n$ 个连续的减号。我们将使用以下 $4$ 条命令来实现这一目标:
- `h`:如果光标位于第一个字符上,则该命令不执行任何操作;否则,光标向左移动一个字符。
- `l`:如果光标位于最后一个字符上,则该命令不执行任何操作;否则,光标向右移动一个字符。
- `Y`:将从光标所在位置开始、一直延伸到文本末尾的字符序列复制到剪贴板,并“覆盖”剪贴板先前的所有内容。(如果光标位于文本的第一个字符上,则整段文本都会被复制到剪贴板。)
- `P`:将剪贴板中存储的文本复制一份,插入到光标当前所在字符之前,并将光标移动到最后一个新插入的字符上。剪贴板内容不会改变。如果剪贴板为空,则不执行任何操作。
编写一个程序,读入 $n$,输出在上述条件下使 Vim 中最终恰好出现 $n$ 个连续 `-` 字符所需的最少命令数。程序还应输出一个达到最少命令数的命令序列示例。
输入格式
第一行包含测试用例数量 $t$。接下来的 $t$ 行分别给出每个测试用例期望的字符串长度 $n$。
输出格式
对于每个测试用例,在单独一行中输出所需的最少命令数,以及一个满足要求的命令序列示例。
说明/提示
### 样例解释
如下表所示,在第一个测试用例中,命令序列 `YPYPhPYPPP` 可以得到正确结果。屏幕(Screen)列中的 `=` 字符表示光标当前所在的 `-` 字符。
| 步骤 | 命令 | 屏幕 | 剪贴板 |
|:-:|:-:|:-:|:-:|
| $0$ | | `=` | (空) |
| $1$ | `Y` | `=` | `-` |
| $2$ | `P` | `=-` | `-` |
| $3$ | `Y` | `=-` | `--` |
| $4$ | `P` | `-=--` | `--` |
| $5$ | `h` | `=---` | `--` |
| $6$ | `P` | `-=----` | `--` |
| $7$ | `Y` | `-=----` | `-----` |
| $8$ | `P` | `-----=-----` | `-----` |
| $9$ | `P` | `---------=------` | `-----` |
| $10$ | `P` | `-------------=-------` | `-----` |
### 限制条件
- $1\le t\le 100$
- $1\le n\le 10^7$
### 子任务
如果只输出了正确的命令数,却没有输出命令序列示例,或者输出的示例不正确,则只能获得该子任务一半的分数。
- 子任务 $1$($20$ 分):$n\le 100$
- 子任务 $2$($8$ 分):$n\le 1000$
- 子任务 $3$($18$ 分):$n\le 10^4$
- 子任务 $4$($18$ 分):$n\le 10^5$
- 子任务 $5$($18$ 分):$n\le 10^6$
- 子任务 $6$($18$ 分):无额外限制。
翻译由 ChatGPT-5.6 完成