P5734 【深基6.例6】文字处理软件

题目描述

你需要开发一款文字处理软件。最开始时输入一个字符串作为初始文档。可以认为文档开头是第 0 0 0 个字符。需要支持以下操作:

  • 1 str:后接插入,在文档后面插入字符串 str \texttt{str} str,并输出文档的字符串。

  • 2 a b:截取文档部分,只保留文档中从第 a a a 个字符起 b b b 个字符,并输出文档的字符串。

  • 3 a str:插入片段,在文档中第 a a a 个字符前面插入字符串 str \texttt{str} str,并输出文档的字符串。

  • 4 str:查找子串,查找字符串 str \texttt{str} str 在文档中最先的位置并输出;如果找不到输出 − 1 -1 −1。

为了简化问题,规定初始的文档和每次操作中的 str \texttt{str} str 都不含有空格或换行。最多会有 q q q 次操作。

输入格式

第一行输入一个正整数 q q q,表示操作次数。

第二行输入一个字符串 str \texttt{str} str,表示最开始的字符串。

第三行开始,往下 q q q 行,每行表示一个操作,操作如题目描述所示。

输出格式

一共输出 n n n 行。

对于每个操作 1 , 2 , 3 1,2,3 1,2,3,根据操作的要求输出一个字符串。

对于操作 4 4 4,根据操作的要求输出一个整数。

样例 #1

样例输入 #1

4
ILove
1 Luogu
2 5 5
3 3 guGugu
4 gu

样例输出 #1

ILoveLuogu
Luogu
LuoguGugugu
3

提示

数据保证, 1 ≤ q ≤ 100 1 \leq q\le 100 1≤q≤100,开始的字符串长度 ≤ 100 \leq 100 ≤100。

1.题目分析

输入一行操作数次数N和初始字符串,后面N行输入操作数及题目要求的输入,

每一次操作数,需要打印一次结果,而不是最后统一打印。

值得一提的是,每一次对初始字符串的变动需要同步到字符串本身,意味着可能有些操作需要将初始字符串清空,把结果复制到字符串。

2.题目思路

定义几个数组,分别用于存放初始字符串和临时字符串。写一个循环,循环次数为操作数的次数,每一次键入操作数,嵌套一个switch,根据题目要求对不同的操作数进行相应的输出:

  • 在文档后面插入字符串
  • 保留文档中从第a 个字符起后b个字符
  • 插入片段
  • 查找子串

具体的细节,我在代码里的注释有所提到。值得注意的是,strlen函数是全局变化的,意味着你对数组的长度进行修改将是动态的。

3.代码实现

cpp 复制代码
#include <string.h>
#include <iostream>

using namespace std;


int main() {
    int n, num;
    cin >> n;
    char str[100] = {0};
    char temp[100] = {0};
    char temp1[100] = {0};
    char temp2[100] = {0};
    //输入初始字符串
    cin >> str;
    for (int i = 0; i < n; ++i) {
        //输入操作数
        cin >> num;
        switch (num) {
            case 1:
                //在文档后面插入字符串
                cin >> temp;
                for (int j = 0; j < strlen(temp); ++j) {
                    //strlen函数是全局变化的
                    str[strlen(str)] = temp[j];
                }
                cout << str << endl;
                break;
            case 2:
                //保留文档中从第a 个字符起后b个字符
                int a, b;
                cin >> a;
                cin >> b;
                for (int j = 0; j < b; ++j) {
                    temp1[j] = str[a + j];
                }
                //将原数组清零
                for (int j = 0; j < 100; ++j) {
                    str[j] = 0;
                }
                //重新赋值
                for (int j = 0; j < strlen(temp1); ++j) {
                    str[j] = temp1[j];
                }
                cout << str << endl;
                break;
            case 3:
                //插入片段
                int x;
                cin >> x;
                cin >> temp2;
                for (int j = 0; j < strlen(temp2); ++j) {
                    //需要从插入的每一个字符
                    char c = temp2[j];
                    for (int k = strlen(str) - 1; k >= x + j; k--) {
                        //当前插入位置的后面所有元素往后移动一位
                        str[k + 1] = str[k];
                    }
                    //插入到指定位置
                    str[x + j] = c;
                }
                cout << str << endl;
                break;
            case 4:
                //查找子串
                int index;
                char son[100];
                cin >> son;
                //定义一个标记变量 存在字串为1,不存在为0
                int flag;
                for (int j = 0; j < strlen(str); ++j) {
                    flag = 1;
                    for (int k = 0; k < strlen(son); ++k) {
                        //字串和原字符串的子集进行比较
                        if (str[j + k] != son[k]) {
                            flag = 0;
                        }
                    }
                    if (flag == 1) {
                        //如果相同,打印当前当前索引,并跳出循环
                        index = j;
                        cout << index << endl;
                        break;
                    }
                }
                if (flag == 0) {
                    //不同则打印-1
                    cout << -1 << endl;
                }
                break;
            default:
                break;
        }
    }

    return 0;
}
相关推荐
忘梓.6 分钟前
解锁动态规划的奥秘:从零到精通的创新思维解析(4)
算法·动态规划
戊辰happy4 小时前
arcface
算法
浊酒南街5 小时前
决策树python实现代码1
python·算法·决策树
獨枭6 小时前
CMake 构建项目并整理头文件和库文件
c++·github·cmake
冠位观测者6 小时前
【Leetcode 热题 100】208. 实现 Trie (前缀树)
数据结构·算法·leetcode
小王爱吃月亮糖8 小时前
C++的23种设计模式
开发语言·c++·qt·算法·设计模式·ecmascript
就爱学编程9 小时前
重生之我在异世界学编程之C语言:数据在内存中的存储篇(下)
java·服务器·c语言
小哈龙9 小时前
c++ 类似与c# 线程 AutoResetEvent 和 ManualResetEvent的实现
c++·c#·多线程
IT猿手9 小时前
最新高性能多目标优化算法:多目标麋鹿优化算法(MOEHO)求解LRMOP1-LRMOP6及工程应用---盘式制动器设计,提供完整MATLAB代码
开发语言·算法·matlab·智能优化算法·多目标算法
kittygilr9 小时前
matlab中的cell
开发语言·数据结构·matlab