洛谷 B4578:[GESP202609 三级] 分割字符串 ← 字符串

​【题目来源】
https://www.luogu.com.cn/problem/B4578

【题目描述】
小明拿到了一段字符串文本,小明希望用下面的规则分割这个字符串:
1. 小明从左到右扫描字符串,遇到第一个空格后停止,并将字符串分割为左右两个部分(舍弃用于分割的这个空格);
2. 对于上次分割后右侧的字符串,小明继续扫描,第一次遇到连续两个空格后停止,并将字符串分割为左右两个部分(舍弃用于分割的这两个空格);
3. 对于上次分割后右侧的字符串,小明继续扫描,第一次遇到连续三个空格后停止,并将字符串分割为左右两个部分(舍弃用于分割的这三个空格);
4. 以此类推,小明每分割一次,下一次分割就需要更长的连续空格;直到字符串无法再次分割。
最后输出每次分割的左侧的字符串,以及最后一次分割的右侧字符串。
如果字符串完全无法进行任何一次分割,直接输出其本身。

【输入格式】
输入一行,一个字符串。

【输出格式】
输出若干行。每行为分割后的一个字符串,注意依次输出:
第一次分割左侧的字符串,第二次分割左侧的字符串,……,最后一次分割左侧的字符串,最后一次分割右侧的字符串。

【输入样例】
sdfd 55 55   99312

【输出样例】
sdfd
55 55
 99312

【数据范围】
字符串长度不超过 1000,字符串中只包含大写字母、小写字母,数字,或空格,且输入字符串不会以空格结尾。
特别强调:输入仅一行,但可能包含若干空格。

【算法分析】
● s.find(t); → 在主串中,从下标 0 这个位置开始往后查找子串 t​​​​​​​,返回子串 t 在主串 s 中第一次出现的起始下标。​​​​​​​

#include <bits/stdc++.h>
using namespace std;

int main() {
    string s="abc 123";
    string t=" 12";
    cout<<s.find(t); //3
    return 0;
}

● s.find(t, pos); → 在主串中,从下标 pos 这个位置开始往后查找子串 t​​​​​​​,返回子串 t 在主串 s 中第一次出现的起始下标。

#include <bits/stdc++.h>
using namespace std;

int main() {
    string s="abcdabcdabcd";
    string t="abc";
    cout<<s.find(t,5)<<endl; //8
    cout<<s.find(t,6)<<endl; //8
    return 0;
}

● s.find(*) 返回值类型为 size_t(无符号整型)。
若匹配到子串,返回合法下标(非负),赋值给 int 可正常运行;
若查找失败,则返回 string::npos,它是 size_t 所能表示的最大值。将这个极大无符号值强制转换为 int 时,会得到负数。
若字符串长度超出 int 上限,转换会发生溢出,在竞赛中引发“未定义行为”。所以,推荐使用 size_t 类型变量接收 s.find() 的返回值。​​​​​​​

【算法代码一】

#include <bits/stdc++.h>
using namespace std;

int main() {
    string s;
    getline(cin,s);

    int cnt=1;
    while(1) {
        string spa;
        for(int i=0; i<cnt; i++) {
            spa+=" ";
        }

        int pos=s.find(spa);
        if(pos<0 || pos>=s.size()) break;
        for(int i=0; i<pos; i++) {
            cout<<s[i];
        }
        cout<<endl;

        string res;
        for(int i=pos+cnt; i<s.length(); i++) {
            res+=s[i];
        }
        s=res;
        cnt++;
    }
    cout<<s<<endl;

    return 0;
}

/*
in:
sdfd 55 55   99312

out:
sdfd
55 55
 99312
*/

【算法代码二】
string spa(cnt, ' ');  // 生成包含 cnt 个空格的字符串 spa。

#include <bits/stdc++.h>
using namespace std;

int main() {
    string s;
    getline(cin,s);

    int cnt=1;
    size_t pos=0;
    while(true) {
        string spa(cnt,' ');
        size_t p=s.find(spa,pos);
        if(p==string::npos) break;
        cout<<s.substr(pos,p-pos)<<endl;
        pos=p+cnt;
        cnt++;
    }
    cout<<s.substr(pos)<<endl;
    return 0;
}

/*
in:
sdfd 55 55   99312

out:
sdfd
55 55
 99312
*/




【参考文献】
https://gesp.ccf.org.cn/101/attach/1767258728693792.pdf

 

​

posted @ 2026-09-24 15:10  Triwa  阅读(8)  评论(0)    收藏  举报