CCCC天梯赛L1-094 剪切粘贴

题目链接:

字符串函数:

1、截取字符串:

    //起始位置为3,结束位置为5
    string s = "aabcdefg";
    
    //下标从0开始 [从开始位置,结束位置]
    string sub = s.substr(3,3);
    //输出cde, 有返回值string
    //并且原字符串不改变, s="aabcdefg"

2、删除字符串:

    //起始位置为3,结束位置为5
    string s = "aabcdefg";
    
    //下标从0开始 [从开始位置,删除长度]
    s.erase(3,3);
    //s = aabfg, 无返回值

3、寻找字符串

    //查找 "cde"
    string s = "aabcdefg";
    
    //下标从0开始  返回找的的字符串的一个字母下标
    int x = s.find("cde");
    //x = 3, find函数有返回值

4、插入字符串

    //从3插入字符串"ggg"
    string s = "aabcdefg";
    //从0开始 在3之前插入
    s.insert(3, "ggg");
    //输出 aabgggcdefg

思路:

题目要求我们在给定两个位置中间插入,这里容易搞混淆:

1、错误写法:

    //假设要在a,b之间插入"cde"
    string s = "aabfg";
    
    int p1 = s.find("a");
    int p2 = s.find("b");
    if(p1+1 == p2){
        s.insert(p2, "cde");
    }
    //p1 = 0, p2 = 2;
    //输出 s = "aabfg"

这种写法是错误的,它没有在a,b之间插入。它是分别查找a,b在字符串第一次出现的位置,如果a是连续的,那么它就查询不到了。

2、正确写法:

    //假设要在a,b之间插入"cde"
    string s = "aabfg";
    //让k="ab"
    string k = ""; k+="a"; k+="b";
    //在s中查找ab位置
    int p = s.find(k);
    //1是a的长度
    s.insert(p+1, "cde");
    //输出s = "aacdebfg" p = 1;

我们在字符串中查找ab位置,如果能查找到ab,那么返回的是a的位置p, p 在加上 a 的长度,就是插入的位置了。

代码如下:

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N =110;

int n;
string s;

signed main(){
    cin >> s; cin >> n;
    while(n--){
        int start, end;
        string p1, p2;
        cin >> start >> end >> p1 >> p2;
        //剪切
        string sub=s.substr(start-1, end-start+1);
        s.erase(start-1, end-start+1);
        //粘贴
        int t = -1;
        string m = p1+p2;
        int p = s.find(m);
        if(p != -1){
            t = p+p1.size();
        }
        
        if(t != -1){
            s.insert(t, sub);
        }
        else s += sub;
    }
    cout << s << endl;
    return 0;
}