10340 文本编辑器(vim)

news2024/11/23 14:49:19

经验值: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.coloradmin.cn/o/2223962.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

用扣子模板,走AI捷径,这个双11,大模型要发威了?

AI离我们越来越近&#xff0c;还是越来越远&#xff1f; 一年前&#xff0c;ChatGPT刚出现那会儿&#xff0c;AI极其火热&#xff0c;很多国内企业奋不顾身的杀进去&#xff0c;或自研或投资或结盟&#xff0c;那时&#xff0c;感觉AI已经离我们很近了&#xff0c;一场商业革命…

单链表OJ题:移除链表元素(力扣)

目录 解法一&#xff1a;带头节点的新链表 解法二&#xff1a;不带头节点的新指向关系链表 总结 这是一道简单的力扣题目&#xff0c;关于解法的话&#xff0c;这里提供了二种思路&#xff0c;重点解释前两种&#xff0c;还有一种思路好想&#xff0c;但是时间复杂度为O(n^2…

使用Prometheus对微服务性能自定义指标监控

背景 随着云计算和容器化技术的不断发展&#xff0c;微服务架构逐渐成为现代软件开发的主流趋势。微服务架构将大型应用程序拆分成多个小型、独立的服务&#xff0c;每个服务都可以独立开发、部署和扩展。这种架构模式提高了系统的可伸缩性、灵活性和可靠性&#xff0c;但同时…

Java.9--集合

一、Collection接口 -->单列集合&#xff08;共享给大家&#xff09; .add();把给定的对象添加到当前集合中 clear();清空集合中所有的元素 remove();把给定的对象在当前集合中删除 contains();判断当前集合中是否包含给定的对象 isEmpty();判断当前集合是否为空 siz…

SQL注入之sqlilabs靶场21-30题

重点插入&#xff1a;html表 第二十一题 分析过程&#xff1a;&#xff08;没有正确的账号密码是否能拿到Cookie&#xff1f;最后注释好像只能使用#&#xff0c;--好像无法注释&#xff09; 查看源码 这里输入账号密码处被过滤了 但Cookie被base64编码了 可以从Cookie入手 …

智联招聘×Milvus:向量召回技术提升招聘匹配效率

01. 业务背景 在智联招聘平台&#xff0c;求职者和招聘者之间的高效匹配至关重要。招聘者可以发布职位寻找合适的人才&#xff0c;求职者则通过上传简历寻找合适的工作。在这种复杂的场景中&#xff0c;我们的核心目标是为双方提供精准的匹配结果。在搜索推荐场景下&#xff0c…

Ollama+Open WebUI,windows部署一个本地AI

在Ollama官网下载&#xff0c;点击DownLoad 下载完之后进行安装&#xff0c;配置环境变量&#xff0c;完成后打开CMD命令行工具测试 运行并下载模型 之后选择Open WebUI作为图形化界面 &#x1f680; Getting Started | Open WebUI 运行Docker命令 docker run -d -p 3000:80…

【Sublime Text】设置中文 最新最详细

在编程的艺术世界里&#xff0c;代码和灵感需要寻找到最佳的交融点&#xff0c;才能打造出令人为之惊叹的作品。而在这座秋知叶i博客的殿堂里&#xff0c;我们将共同追寻这种完美结合&#xff0c;为未来的世界留下属于我们的独特印记。 【Sublime Text】设置中文 最新最详细 开…

万字图文实战:从0到1构建 UniApp + Vue3 + TypeScript 移动端跨平台开源脚手架

&#x1f680; 作者主页&#xff1a; 有来技术 &#x1f525; 开源项目&#xff1a; youlai-mall &#x1f343; vue3-element-admin &#x1f343; youlai-boot &#x1f343; vue-uniapp-template &#x1f33a; 仓库主页&#xff1a; Gitee &#x1f4ab; Github &#x1f…

团结引擎内置 AI 助手团结 Muse Chat 测试版上线!新功能怎么用?能做什么?

在开发过程中&#xff0c;快速获得精准的技术支持能够有效提高开发效率。生成式 AI 的出现为实现实时技术支持提供了新的机会。Unity 中国积极探索 AI 在开发中的应用&#xff0c;并在团结引擎 1.3.0 版本中上线了新功能&#xff1a;团结 Muse Chat。 团结 Muse Chat 是 Unity…

【linux】服务器Ubuntu20.04安装cuda11.8教程

【linux】服务器Ubuntu20.04安装cuda11.8教程 文章目录 【linux】服务器Ubuntu20.04安装cuda11.8教程到官网找到对应版本下载链接终端操作cudnn安装到官网下载下载后解压进入解压后的目录&#xff1a;将头文件复制到 /usr/local/cuda/include/ 目录&#xff1a;将库文件复制到 …

Matlab学习02-matlab中的数据显示格式及符号变量

目录 一&#xff0c;关系运算和逻辑运算 二&#xff0c;变量 三&#xff0c;数据显示格式 四&#xff0c;符号运算 1&#xff0c;创建符号变量 2&#xff0c;数值矩阵转换成符号矩阵 一&#xff0c;关系运算和逻辑运算 在matlab中&#xff0c;只要数值不是 &#xff0…

Lucas带你手撕机器学习——岭回归

岭回归&#xff08;Ridge Regression&#xff09; 一、背景与引入 在进行线性回归分析时&#xff0c;我们常常面临多重共线性的问题。多重共线性指的是自变量之间高度相关&#xff0c;这会导致回归系数的不稳定性&#xff0c;使得模型的预测能力降低。传统的线性回归通过最小…

【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…

微服务网关Zuul

一、Zuul简介 Zuul是Netflix开源的微服务网关&#xff0c;包含对请求的路由和过滤两个主要功能。 1&#xff09;路由功能&#xff1a;负责将外部请求转发到具体的微服务实例上&#xff0c;是实现外部访问统一入口的基础。 2&#xff09;过滤功能&#xff1a;负责对请求的过程…

ReactOS系统中搜索给定长度的空间地址区间中的二叉树

搜索给定长度的空间地址区间 //搜索给定长度的空间地址区间 MmFindGap MmFindGapTopDown PVOID NTAPI MmFindGap(PMADDRESS_SPACE AddressSpace,ULONG_PTR Length,ULONG_PTR Granularity,BOOLEAN TopDown );PMADDRESS_SPACE AddressSpace,//该进程用户空间 ULONG_PTR Length,…

spring整合使用xml方式整合Druid数据源连接池

1.普通的JDBC数据库连接使用 DriverManager 来获取&#xff0c;每次向数据库建立连接的时候都要将 Connection加载到内存中&#xff0c;再验证用户名和密码(得花费0.05s&#xff5e;1s的时间)。需要数据库连接的时候&#xff0c;就向数据库要求 一个&#xff0c;执行完成后再断…

2024 年 MathorCup妈杯A题台风的分类与预测论文首发+代码分享

基于多模型方法的台风分类、路径预测及登陆后降水影响分析 摘要 台风作为全球最严重的自然灾害之一&#xff0c;具有极大的破坏性和复杂性&#xff0c;其预测和分类具有重要意义。本文基于历史台风数据&#xff0c;针对台风的特征分类、路径预测以及登陆后的降水量和风速变化…

linux网络编程5——Posix API和网络协议栈,使用TCP实现P2P通信

文章目录 Posix API和网络协议栈&#xff0c;使用TCP实现P2P通信1. socket()2. bind()3. listen()4. connect()5. accept()6. read()/write(), recv()/send()7. 内核tcp数据传输7.1 TCP流量控制7.2 TCP拥塞控制——慢启动/拥塞避免/快速恢复/快速重传 8. shutdown()9. close()9…

Jvm中的堆和栈

JVM中的堆和栈分别存放不同的数据类型和内容。 ‌栈&#xff08;Stack&#xff09;‌&#xff1a; 存储基本数据类型&#xff08;如int, char, boolean等&#xff09;和对象的引用。存储局部变量、方法调用、程序运行状态、方法返回值等。每个线程都有一个独立的线程栈&#…