P1116 string字符串编辑大师

暂无评定 传统题 GESP字符串STL栈语法基础 上传者
时间限制1000ms
内存限制256MiB
通过 / 提交0/0

P1116string字符串编辑大师

暂无评定 传统题 GESP字符串STL栈语法基础 上传者
时间限制1000ms
内存限制256MiB
通过 / 提交0/0

题目描述

小D有一个字符串(可能包含空格、字母、数字、标点符号)。
他要对这个字符串进行 n n 次编辑操作,每次操作有三种类型:

  • op == 1:插入
    输入一个整数 x x 和一个字符串 t t ,将 t t 插入到原字符串的第 x x 个字符之后。
    (位置从 1 开始计数,插入后 t t 的第一个字符位于原第 x x 个字符的后面)
    特殊:如果 x=0 x = 0 ,则插入到整个字符串的最前面(即第 0 个字符之后)。
    如果 x x 大于当前字符串长度,则插入到末尾。

  • op == 2:删除
    输入两个整数 x,y x, y ,从第 x x 个字符开始,连续删除 y y 个字符。
    如果当前字符串为空,则无法删除,输出 "error"(不带引号)。
    如果 x x 超出字符串长度,也输出 "error"。
    如果从 x x 开始剩余字符不足 y y 个,则删除到末尾即可(不算错误)。
    删除后字符串可能变空。

  • op == 3:替换
    输入两个整数 x,y x, y 和一个字符串 z z ,将原字符串中从第 x x 个字符开始、长度为 y y 的子串替换为 z z 。
    如果 x x 超出长度,则输出 "error" 且不进行替换。
    如果从 x x 开始剩余字符不足 y y ,则只替换实际存在的部分(等价于删除后插入)。
    替换后字符串长度会变化(z z 的长度与 y y 可以不同)。

每次操作结束后,输出当前完整的字符串。
如果字符串为空,则输出 "(empty)"。

输入格式

第一行:一个字符串 s s ,初始字符串(可能包含空格,也可能为空行)。
第二行:一个整数 n n ,表示操作次数。
接下来 n n 行,每行描述一个操作:

  • op == 1:1 x 然后换行输入字符串 t t (可能含空格)
  • op == 2:2 x y
  • op == 3:3 x y 然后换行输入字符串 z z (可能含空格)

注意:

  • 所有位置 x x 从 1 开始计数(x = 0 仅对插入操作有效,表示开头)。
  • 输入中可能包含多行,需要正确处理换行符。
  • 初始字符串可能为空行:此时第一行是空行。读取时需用 getline 读完整行。

输出格式

对于每次操作,输出一行结果:

  • 如果操作成功执行(包括部分删除、部分替换),输出当前字符串,空字符串输出 "(empty)"。
  • 如果操作出错(删除或替换时字符串为空或位置无效),输出 "error",且字符串保持不变,不执行该操作。
  • 插入操作不会出错(x 范围自动适配,总是成功)。

输入输出样例

样例输入 #1

I love C++
3
1 1
 very
2 8 5
3 1 1
You

样例输出 #1

I very love C++
I very C++
You very C++

样例输入 #2

abcde
4
1 2
xy
2 3 2
3 1 3
123
1 0
start

样例输出 #2

abxycde
abxde
123de
start123de

解释:

  • 初始 "abcde"
  • 操作1:插入 "xy" 到第2个字符 'b' 之后 → "abxycde"
  • 操作2:从第3个字符开始删2个(x 和 y)→ "abxde"
  • 操作3:从第1个字符开始,替换3个字符为 "123" → "123de"
  • 操作4:x=0 插入 "start" 到开头 → "start123de"

说明/提示

如何实现这些操作?

  1. 插入 insert(pos, str)

    • 位置 pos 从 0 开始,所以第 x 个字符之后对应 pos = x(因为 s.insert(x, t) 表示在索引 x 之前插入)。
    • 例如:s = "abc",s.insert(1, "xx") 得到 "axxbc"。
    • 要实现“在第 x 个字符之后插入”,应使用 s.insert(x, t)(x 表示原字符串前 x 个字符之后)。
    • 当 x=0 时插入到开头:s.insert(0, t)。
    • 当 x >= s.size() 时插入到末尾:s.insert(s.size(), t)。
  2. 删除 erase(pos, count)

    • pos 从 0 开始,删除从 pos 开始的 count 个字符。
    • 题目中 x 从 1 开始,对应 pos = x-1。
    • 删除前检查:如果 s.empty() 或 x-1 >= s.size(),则输出 error 且不执行。
    • 否则执行 s.erase(x-1, y)(y 超出长度会自动删到末尾)。
  3. 替换 replace(pos, count, str)

    • pos 从 0 开始,count 表示要替换的原字符个数。
    • 将 s 中从 pos 开始的 count 个字符替换为 str。
    • 如果 x-1 >= s.size(),输出 error。
    • 否则如果剩余长度不足 y,则 count 可以设为剩余长度(直接用 y 也没问题,replace 会自动处理)。
    • 注意:replace 可以一次性实现删除+插入。
  4. 读入含空格的字符串

    • 所有字符串(初始字符串,插入的 t,替换的 z)都可能包含空格。
    • 使用 getline(cin, str) 读取一整行。
    • 注意在读取整数后要 cin.ignore() 清除换行符。
    • 初始字符串可能为空行,需要用 getline 读取。

注意事项

  • 使用 int 类型存储 x 和 y,与 s.size() 比较时注意类型转换(size() 返回 size_t 无符号,直接比较可能产生警告,可强转 int)。
  • 插入时 x 可能等于 s.size(),表示末尾插入,insert 直接支持。
  • 删除和替换前,一定要先判断错误条件。
  • 输出空字符串时要输出 "(empty)"(注意括号是英文半角)。

数据规模

  • 初始字符串长度(含空格):0≤∣s∣≤200 0 \le |s| \le 200
  • 操作次数 1≤n≤50 1 \le n \le 50
  • 每次插入/替换的字符串长度 0≤∣t∣,∣z∣≤100 0 \le |t|,|z| \le 100
  • 删除的字符数 1≤y≤200 1 \le y \le 200
  • 位置 x x 满足 0≤x≤104 0 \le x \le 10^4 (但超过长度时按规则处理)