L1-094 剪切粘贴
作者:
lvjj
,
2024-04-14 21:15:15
,
所有人可见
,
阅读 9
//如果有多个可插入的位置,选择最靠近当前操作字符串开头的一个。
//find默认情况就是找到第一个出现的,所以不用再分类讨论了
#include <bits/stdc++.h>
using namespace std;
int main(){
string str;
cin>>str;
str='0' + str;//string的下标是0开始,但题目的操作是从1开始,所以在str最前面加个字符来填充,格式好看一些
int n;
cin>>n;
while(n--){
int a,b;
//首先暂时记录str中10~18的字符串用substr
//接着删除str中10~18的字符串用erase
//输入ery,cor(s1,s2)
//将他俩拼接为erycor
//然后在str里面找是否匹配,找到了就再找y(s1中最后一个元素)在str的位置,
//做法:通过find找到erycor,默认返回第一个元素位置,那么插入的时候就从第一个元素位置+size()(这里不用减一,因为insert是前插法,实际上迭代器指向的是cor的c,insert就是在c前面插入)
cin>>a>>b;
string c = str.substr(a,b-a+1);//着重注意第二个参数表示从第一个参数向后迭代多少次,比如substr(5,7)表示截取[5,5+7),这里是左闭右开,实际上取的是[5,11]的数据
str.erase(str.begin()+a,str.begin()+b+1);//左闭右开,所以第二个参数要加1
string s1,s2,ss;
cin>>s1>>s2;
ss = s1 + s2;
if(str.find(ss)!=-1){
str.insert(str.find(ss)+s1.size(),c);//find匹配后会返回被匹配字符子串的第一个字符位置,比如从"aaqweaa"要匹配"qwe",返回的是2
}else{
str+=c;
}
}
for(int i=0;i<str.size();i++) if(i!=0)cout<<str[i];//去掉0
return 0;
}