首先表达一下第二次看到这个题目的想法——不想做第二次了。
不过,孔夫子说,”温故知新!“。这里就将第一次没有做出来的遗憾弥补一下吧。
预备知识
cstring 神奇的库
可能各位大犇早就知道这些了,那就直接点个赞跳过去吧。
知识清单
1. string类型支持字符串的直接拼接
string a = "123";
string b = "456";
那么 a+b = "123456"
,这一点看似普通,实则幻化无穷。相比原来的char数组的手动拼接不知道方便了多少。
2. insert函数
insert
并不陌生吧,就是插入。
这里直接介绍最简单的用法。
a.insert(pos, s)
这句话的意思就是,在a字符串的pos位置,插入字符串s。
还是不理解的话看例子。
string a = "123789";
string s = "456";
a.insert(3, s);
结果应该不难想到123456789
。
整个过程就是在pos
为起点,往后添加字符串s
。
3. erase函数
erase
翻译过来就是擦去,说人话,就是删除delete
。
这里同样介绍简单用法。
a.erase(start, len)
我想各位佬可能早就会了,这里我还是再解释一下。
删除从start位置开始的,长度为len的字符串。
不懂?
看例子
string a = "123456789";
a.erase(3, 3);
结果123789
。都看到这里了,想必你也明白了。
4. find函数
这里也不过多解释,就是查找,下面给出最基本的用法。
a.find(b,start)
白话文:在a的start下标往后的字符串里面找b,返回起始索引。
还是粒子法。(你们都举栗子,我偏偏要粒子)
string a = "123456789";
string b = "234";
int pos = a.find(b,0); // 这个返回下标索引
// 也可以使用下main的句子
size_t = a.find(b, 0);
结果就是1
。这里哆嗦一句,如果找不到就会返回一个很特殊的值。
如果你是使用的int pos
就会得到-1
如果你是使用的size_t pos
就会得到a.npos
,这里不了解的自己去查一查,哈哈哈。
5. substr函数
substr
主要是来取出子字符串。
简单用法如下
a.substr(start, len)
从start开始往后取出长度为len的子字符串
还是例子。
string a = "123456789";
string b = a.substr(2, 3);
结果就是b的结果是"345"
正题
终于讲完了基本操作,这里走入正题。
--- ***我是分割线*** ---
首先,剪切操作
剪所选部分
这里我直接使用上面讲过的substr
,一步到位
切走所选部分
这里也是同理,直接上erase
删除,一步到位。
粘贴部分
找到位置
这里题目是给出两个字符串这里我把他叫做s1
和s2
。题目中要求在s1之后,s2之前。如果你是使用两个find
来做的话,感觉就会变复杂(当时我就是这么做的,最后放弃了)。
换个思路
我们为什么不直接找s1+s2
这个字符串呢?
这样子做的优点有两点:
- 只需要用一个
find
,不需要两个find
的结果来回比较了,比较消耗时间, - 可以减少很多选择的对象,加快速度。
简化到这里就是一句话s.find(s1+s2)
粘贴我们前面的所选部分
我们这里就直接使用insert
,不过这里稍微注意,我们前面是找到一整块的s1+s2
,所以我们插入的时候应该这样s.insert(pos+s1.length(), s3)
。
到这里基本完事。
完整代码
#include <iostream>
#include <cstring>
using namespace std;
string s1, s2, s3, s;
int n, a, b;
int main()
{
cin >> s >> n;
while(n--) {
cin >> a >> b >> s1 >> s2;
s3 = s.substr(a-1, b - a + 1);
s.erase(a-1, b - a + 1);
int len = s1.length();
s1 += s2;
int pos = s.find(s1);
if (pos != -1) s.insert(pos + len, s3);
else s.insert(s.length(), s3);
}
cout << s;
return 0;
}