题目描述
小D有一个字符串(可能包含空格、字母、数字、标点符号)。
他要对这个字符串进行 次编辑操作,每次操作有三种类型:
-
op == 1:插入
输入一个整数 和一个字符串 ,将 插入到原字符串的第 个字符之后。
(位置从 1 开始计数,插入后 的第一个字符位于原第 个字符的后面)
特殊:如果 ,则插入到整个字符串的最前面(即第 0 个字符之后)。
如果 大于当前字符串长度,则插入到末尾。 -
op == 2:删除
输入两个整数 ,从第 个字符开始,连续删除 个字符。
如果当前字符串为空,则无法删除,输出"error"(不带引号)。
如果 超出字符串长度,也输出"error"。
如果从 开始剩余字符不足 个,则删除到末尾即可(不算错误)。
删除后字符串可能变空。 -
op == 3:替换
输入两个整数 和一个字符串 ,将原字符串中从第 个字符开始、长度为 的子串替换为 。
如果 超出长度,则输出"error"且不进行替换。
如果从 开始剩余字符不足 ,则只替换实际存在的部分(等价于删除后插入)。
替换后字符串长度会变化( 的长度与 可以不同)。
每次操作结束后,输出当前完整的字符串。
如果字符串为空,则输出 "(empty)"。
输入格式
第一行:一个字符串 ,初始字符串(可能包含空格,也可能为空行)。
第二行:一个整数 ,表示操作次数。
接下来 行,每行描述一个操作:
op == 1:1 x然后换行输入字符串 (可能含空格)op == 2:2 x yop == 3:3 x y然后换行输入字符串 (可能含空格)
注意:
- 所有位置 从 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"
说明/提示
如何实现这些操作?
-
插入
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)。
- 位置
-
删除
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超出长度会自动删到末尾)。
-
替换
replace(pos, count, str)pos从 0 开始,count表示要替换的原字符个数。- 将
s中从pos开始的count个字符替换为str。 - 如果
x-1 >= s.size(),输出error。 - 否则如果剩余长度不足
y,则count可以设为剩余长度(直接用y也没问题,replace会自动处理)。 - 注意:
replace可以一次性实现删除+插入。
-
读入含空格的字符串
- 所有字符串(初始字符串,插入的
t,替换的z)都可能包含空格。 - 使用
getline(cin, str)读取一整行。 - 注意在读取整数后要
cin.ignore()清除换行符。 - 初始字符串可能为空行,需要用
getline读取。
- 所有字符串(初始字符串,插入的
注意事项
- 使用
int类型存储x和y,与s.size()比较时注意类型转换(size()返回size_t无符号,直接比较可能产生警告,可强转int)。 - 插入时
x可能等于s.size(),表示末尾插入,insert直接支持。 - 删除和替换前,一定要先判断错误条件。
- 输出空字符串时要输出
"(empty)"(注意括号是英文半角)。
数据规模
- 初始字符串长度(含空格):
- 操作次数
- 每次插入/替换的字符串长度
- 删除的字符数
- 位置 满足 (但超过长度时按规则处理)