原题题面
题目描述
给定一个字符串 及 个操作,每次操作如下:
- 输入两个数字 ,,将 中第 到第 个字符删去,并保存到剪切板。
- 输入两个字符串 ,,在修改后的 中寻找子串 ,若可以找到,则在 中 和 之间插入剪切板的内容,若无法找到,则将剪切板的内容添加到 的末尾。
两个操作是成对出现的。
输入样例:
AcrosstheGreatWall,wecanreacheverycornerintheworld
5
10 18 ery cor
32 40 , we
1 6 tW all
14 18 rnerr eache
1 1 e r
输出样例:
he,allcornetrrwecaneacheveryGreatWintheworldAcross
题目分析
本题是对 字符串 的考察,主要是对 string 的 find 和 substr 函数的考察。
本函数意为在字符串 中寻找 的第一个位置下标,若找不到则返回 -1。第二个参数 x 意为从 的下标 pos 开始向后寻找,可不填意为从 0 开始。
本函数意为在字符串 中得到初始位置为 pos,长度为 的子串。第二个参数可不写,意为从 pos 开始到字符串结尾。
对于每次操作,我们首先将原串进行切割,将切割下来的子串保存下来,然后再对新串进行寻找输入的前缀,并比较后缀是否正确。最后对于不同的结果进行本次操作最终串的拼接。
注意字符串中满足前缀的位置可能不止一个,然而后缀不一定满足,需要多次遍历。若存在多个满足要求的前后缀,仅对位置最靠前的进行操作。
Accept代码
#include <bits/stdc++.h>
using namespace std;
int main()
{
string str; cin >> str;
int t; cin >> t;
while (t --)
{
int l, r;
cin >> l >> r;
string st = str.substr(0, l - 1) + str.substr(r);
string sf = str.substr(l - 1, r - l + 1);
string sl, sr;
cin >> sl >> sr;
int nl = sl.size(), nr = sr.size();
int k = st.find(sl);
while (k != -1 && st.substr(k + nl, nr) != sr)
{
k = st.find(sl, k + 1);
}
if (k != -1) st = st.substr(0, k + nl) + sf + st.substr(k + nl);
else st += sf;
str = st;
}
cout << str;
return 0;
}
碎碎念
这是我的第一次天梯赛,也应该是我的最后一场天梯赛。坦然来说,这个结果是我当时那种心态能做到的全部,每个人都会在失利后觉得自己应该能做的更好,但事已至此,我们已无法改变。
最近的生活多少缺少了一些挫折,自己的心态也趋于安逸,这次经历无疑是一次警醒,它提醒我应该去做什么。
只是事后想起,还是会感到遗憾吧。
对不起我的队友。