10340 文本编辑器(vim)

经验值:1600

时间限制:1000毫秒

内存限制:512MB

经开区2023年信息学竞赛试题

 不许抄袭,一旦发现,直接清空经验!

题目描述 Description

李明正在学习使用文本编辑器软件 Vim。与 Word、VSCode 等常用的键鼠配合使用的文本编辑器不同,Vim 采用了键盘操控+模式切换的设计。初始时用户处于普通模式,此时用户可以通过键盘输入命令执行光标移动等操作,或者输入特定命令进入到编辑模式;而在编辑模式中,用户可以从当前光标位置开始,向文本输入内容,然后按 ESC 键切换回普通模式。
李明学习到了普通模式的如下指令。其中(r, c)为当前光标的位置,即第r行 第c列,Lr表示第r行当前的长度,R为当前文本总行数,数学符号min{x, y}表示x与y的最小值,例如min{2,4} = 2:

|指令按键

(注意大小写)操作
h若c > 1,即光标不在最左侧,则将光标左移一格至(r, c − 1)
j若r < R,即光标不位于最后一行,则将光标下移一格至(r + 1, min{c, Lr+1})
k若r > 1,即光标不位于第一行,则将光标上移一格至(r − 1, min{c, Lr-1})
l若c < Lr,即光标不在当前行的最右侧,则右移一格至(r, c + 1)
a切换至编辑模式,将输入内容插入到光标当前位置的右侧
i切换至编辑模式,将输入内容插入到光标当前位置的左侧
A将光标移至本行最右侧的字符处,然后切换至编辑模式,将输入内容插入到光标当前位置的右侧。等价于 lll…a。
I将光标移至本行最左侧的字符处,然后切换至编辑模式,将输入内容插入到光标当前位置的左侧。等价于 hhh…i。

       从编辑模式按 ESC 键切换回普通模式时,光标位置位于编辑模式插入的最后一个字符处(假定每次进入编辑模式后至少向文本中插入一个字符)。初始时,Vim 处于普通模式,光标位置为(1,1)。
       假设当前文本如下,光标位置用粗斜体+下划线+红色标注。李明的键盘输入序列为 jlliHello^kIWorld^,其中^用于表示 ESC 键:

image.png


       对于李明的键盘操作,jll 表示下移一格再右移两格,光标按 A→H→I→I 的顺序移动(其中第二次右移因为触及本行末尾无事发生)。此时光标位置为(2,2),即第 2 行第 2 列。Vim 编辑器界面如下:

image.png


       之后 iHello^表示从当前光标位置进入编辑模式,将插入的内容 Hello 置于此时光标位置 I 的左侧,然后按 ESC 键返回普通模式。此时光标位置为(2,6),指向此次插入内容 Hello 的最后一个字符 o,Vim 编辑器界面如下。另外需注意,指令按键(例如本段示例中的小写字母 l)仅在普通模式下才表示编辑器控制指令,在编辑模式中则作为文本内容输入:

image.png


       然后按 k 键将光标移至上一行。由于上一行的长度小于当前光标所在的列数,因此光标被移到了上一行的末尾。此时光标位置为(1,3):

image.png


       最后一段 IWorld^表示,按 I 键将光标移至本行最左侧的字母 A 处,进入编辑模式并将文本 World 插入到字母 A 的左端,然后按 ESC 退出编辑模式,光标停在插入的最后一个字母 d 处,坐标为(1,5)。

image.png


       已知文本编辑器的初始内容,以及李明的键盘操作序列,你需要输出操作结束后,Vim 编辑器中的文本内容,以及最终光标所在的位置。

输入描述 Input Description

第一行是一个正整数N,表示初始时编辑器中文本的行数;之后N行,每行一个仅包含大小写字母的字符串,表示改行初始时的内容;之后一行为一个仅包含大小写字母和^的字符串,表示李明的键盘操作序列。输入保证操作序列结束后 Vim 处于普通模式,每次进入编辑模式时至少插入一个字符。

输出描述 Output Description

共N + 1行。前N行依次为操作结束后文本编辑器中每一行的内容,最后一行为两个正整数r, c,表示操作结束后光标的位置。

样例输入 Sample Input

样例一: 3 ABC HI OPQRS jlliHello^kIWorld^ 样例二: 3 ABC HI OPQRS jlliHello^kIWorld^jAXyz^jhhaUvw^

样例输出 Sample Output

样例一: WorldABC HHelloI OPQRS 1 5 样例二: WorldABC HHelloIXyz OPQUvwRS 3 6

数据范围及提示 Data Size & Hint

初始时第i行的长度为Li,操作序列的总长度为Lc。所有数据均满足: 1 ≤ N ≤ 100, 1 ≤ Li ≤ 100, 1 ≤ Lc ≤ 10′000
测试数据的分布如下:

占比附加限制
40%普通模式不含 a,i,A,I 指令
30%普通模式不含 a,i,I 指令
20%普通模式不含 a,i 指令
10%

提示与说明:
       注意区分数字 1、小写字母 l 与大写字母 I。本题中光标右移指令为小写字母 l,行首插入的指令为大写字母 I。
       本题目的细节(例如光标的移动策略)与现实中的 Vim 编辑器存在差异,作答时以本题的描述为准。

#include <iostream>
#include <vector>
#include <string>using namespace std;// Vim编辑器类
class VimEditor {
private:vector<string> text; // 文本内容pair<int, int> cursor; // 光标位置public:VimEditor(vector<string> initial_text) {text = initial_text;cursor = make_pair(0, 0);}void executeCommand(char command) {int r = cursor.first, c = cursor.second;int R = text.size();int Lr = text[r].length();if (command == 'h') {if (c > 0) {cursor.second = c - 1;}} else if (command == 'j') {if (r < R - 1) {cursor.first = r + 1;cursor.second = min(c, (int)text[r + 1].length());}} else if (command == 'k') {if (r > 0) {cursor.first = r - 1;cursor.second = min(c, (int)text[r - 1].length());}} else if (command == 'l') {if (c < Lr - 1) {cursor.second = c + 1;}} else if (command == 'a') {text[r].insert(c + 1, 1, ' ');cursor.second = c + 1;} else if (command == 'i') {text[r].insert(c, 1, ' ');cursor.second = c;} else if (command == 'A') {cursor.second = Lr - 1;text[r].insert(Lr, 1, ' ');cursor.second = Lr;} else if (command == 'I') {cursor.second = 0;text[r].insert(0, 1, ' ');}}void processInput(string input) {for (char command : input) {if (command == '^') {// 切换到普通模式continue;}executeCommand(command);}}void printEditorState() {for (string line : text) {cout << line << endl;}cout << cursor.first + 1 << " " << cursor.second + 1 << endl;}
};int main() {int N;cin >> N;cin.ignore(); // 忽略换行符vector<string> initial_text(N);for (int i = 0; i < N; i++) {getline(cin, initial_text[i]);}string input;getline(cin, input);VimEditor editor(initial_text);editor.processInput(input);editor.printEditorState();return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/456983.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

qt QNetworkProxy详解

一、概述 QNetworkProxy通过设置代理类型、主机、端口和认证信息&#xff0c;可以使应用程序的所有网络请求通过代理服务器进行。它支持为Qt网络类&#xff08;如QAbstractSocket、QTcpSocket、QUdpSocket、QTcpServer、QNetworkAccessManager等&#xff09;配置网络层代理支持…

arthas使用 笔记

下载启动 curl -O https://arthas.aliyun.com/arthas-boot.jarjava -jar arthas-boot.jar基本命令使用 JVM相关命令 Dashboard - 仪表盘 用途&#xff1a;查看当前Java应用的实时性能面板&#xff0c;包括CPU、线程、内存使用情况等。场景&#xff1a;快速概览系统整体健康…

【JAVA】第三张_Eclipse下载、安装、汉化

简介 Eclipse是一种流行的集成开发环境&#xff08;IDE&#xff09;&#xff0c;可用于开发各种编程语言&#xff0c;包括Java、C、Python等。它最初由IBM公司开发&#xff0c;后来被Eclipse Foundation接手并成为一个开源项目。 Eclipse提供了一个功能强大的开发平台&#x…

JavaWeb——Maven(5/8):依赖管理-依赖配置(Maven 项目中的依赖配置、访问仓库网站、配置依赖的注意事项)

目录 依赖配置 Maven 项目中的依赖配置 访问仓库网站 配置依赖的注意事项 接下来&#xff0c;我们了解 Maven 当中的第三方依赖管理。 Maven 第三方依赖管理的重要性 依赖管理是 Maven 这款工具最核心的功能。在依赖管理这部分&#xff0c;我们主要讲解四个方面&#xff…

uniapp一键打包

1.先安装python环境&#xff0c; 2.复制这几个文件到uniapp项目里面 3.修改自己证书路径&#xff0c;配置文件路径什么的 4.在文件夹页面双击buildController.py或者cmd直接输入buildController.py 5.python报错&#xff0c;哪个依赖缺少安装哪个依赖 6.执行不动的话&…

语音提示器-WT3000A离在线TTS方案-打破语种限制/AI对话多功能支持

前言&#xff1a; TTS&#xff08;Text To Speech &#xff09;技术作为智能语音领域的重要组成部分&#xff0c;能够将文本信息转化为逼真的语音输出&#xff0c;为各类硬件设备提供便捷的语音提示服务。本方案正是基于唯创知音的离在线TTS&#xff08;离线本地音乐播放与在线…

STM32--基于STM32F103C8T6的OV7670摄像头显示

本文介绍基于STM32F103C8T6实现的OV7670摄像头显示设计&#xff08;完整资源及代码见文末链接&#xff09; 一、简介 本文实现的功能&#xff1a;基于STM32F103C8T6实现的OV7670摄像头模组实时在2.2寸TFT彩屏上显示出来 所需硬件&#xff1a; STM32F103C8T6最小系统板、OV76…

HivisionIDPhoto Docker部署以及Springboot接口对接(AI证件照制作)

项目简介 项目以及官方文档地址 HivisionIDPhoto 旨在开发一种实用、系统性的证件照智能制作算法。 它利用一套完善的AI模型工作流程&#xff0c;实现对多种用户拍照场景的识别、抠图与证件照生成。 HivisionIDPhoto 可以做到&#xff1a; 轻量级抠图&#xff08;纯离线&a…

Mysql主主互备配置

在现有运行的mysql环境下&#xff0c;修改相关配置项&#xff0c;完成主主互备模式的部署。 下面的配置说明中设置的mysql互备对应服务器IP为&#xff1a; 192.168.1.6 192.168.1.7 先检查UUID 在mysql的数据目录下&#xff0c;检查主备mysql的uuid&#xff08;如下的server-…

Unity实现DBSCAN

参考连接 直接上代码&#xff0c;把脚本挂载到场景中的物体上&#xff0c;运行应该就就能看到效果。 using System.Collections; using System.Collections.Generic; using UnityEngine;public class TestDBSCAN : MonoBehaviour {private List<GameObject> goList new…

【ARM】ARM架构参考手册_Part B 内存和系统架构(5)

目录 5.1关于缓存和写缓冲区 5.2 Cache 组织 5.2.1 集联性&#xff08;Set-associativity&#xff09; 5.2.2 缓存大小 5.3 缓存类型 5.3.1 统一缓存或分离缓存 5.3.2 写通过&#xff08;Write-through&#xff09;或写回&#xff08;Write-back&#xff09;缓存 5.3.3…

BFS解决FloodFill算法(4)_被围绕的区域

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 BFS解决FloodFill算法(4)_被围绕的区域 收录于专栏【经典算法练习】 本专栏旨在分享学习算法的一点学习笔记&#xff0c;欢迎大家在评论区交流讨论&#x1f48c…

【R + Python】iNaturalist 网站图片下载 inat api

文章目录 一、iNaturalist 简介二、R语言API&#xff1a;rinat三、示例3.1 获取观测数据3.2 绘制可视化图像函数用法 3.4 在区域网格中搜索3.5 下载图片3.51 提取图片 url3.52 下载图片: R语言3.53 下载图片: python 四、获取详细rinat包的文档 一、iNaturalist 简介 &#x1…

8.three.js相机详解

8.three.js相机详解 1、 认识相机 在Threejs中相机的表示是THREE.Camera&#xff0c;它是相机的抽象基类&#xff0c;其子类有两种相机&#xff0c;分别是正投影相机THREE.OrthographicCamera和透视投影相机THREE.PerspectiveCamera&#xff1a; 正投影和透视投影的区别是&am…

深度学习技术演进:从 CNN、RNN 到 Transformer 的发展与原理解析

深度学习的技术演进经历了从卷积神经网络&#xff08;CNN&#xff09;到循环神经网络&#xff08;RNN&#xff09;再到 Transformer 的重要发展。这三个架构分别擅长处理图像、序列数据和多种任务的特征&#xff0c;标志着深度学习在不同领域取得的进步。 1. 卷积神经网络&…

java智能物流管理系统源码(springboot)

项目简介 智能物流管理系统实现了以下功能&#xff1a; 智能物流管理系统的主要使用者分为管理员&#xff0c;顾客&#xff0c;员工&#xff0c;店主。功能有个人中心&#xff0c;顾客管理&#xff0c;员工管理&#xff0c;店主管理&#xff0c;门店信息管理&#xff0c;门店…

Go 语言中的 for range 循环教程

在 Go 语言中&#xff0c;for range 循环是一个方便的语法结构&#xff0c;用于遍历数组、切片、映射和字符串。本教程将通过示例代码来帮助理解如何在 Go 中使用 for range 循环。 package mainimport "fmt"func main() {// 遍历切片并计算和nums : []int{2, 3, 4}…

OpenCV视觉分析之目标跟踪(1)计算密集光流的类DISOpticalFlow的介绍

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 这个类实现了 Dense Inverse Search (DIS) 光流算法。更多关于该算法的细节可以在文献 146中找到。该实现包含了三个预设参数集&#xff0c;以提…

Visual studio 下载安装

1&#xff0c;Visual stutdio 网址 下载 Visual Studio Tools - 免费安装 Windows、Mac、Linux 2&#xff0c;下划页面&#xff0c;点击 较早的下载 3&#xff0c;选择对应的版本进行下载

蓝牙技术的多种模式详解

蓝牙作为一种广泛应用的无线通信技术&#xff0c;已经在我们的日常生活中无处不在。随着技术的发展&#xff0c;蓝牙已经不再仅限于传统的音频传输&#xff0c;而是扩展到了各种应用领域。本文将深入探讨蓝牙的各种模式及其应用场景。 1. 经典蓝牙&#xff08;BR/EDR&#xff…