OneCoder Avatar
OneCodercoderli.com · 955 篇博文
三级

C++ 算法考级专栏

真题分析、矩阵探测、递归回溯与基础语法

🎨 视觉封面

【字符串模拟与动态子串检索】GESP三级 / CSP-J 题解:luogu-B4578 [GESP202609 三级] 分割字符串

📅 2026-09-15·✍️ OneCoder·计算中...·⏱️ 5 分钟
#GESP#C++#GESP三级#CSP-J#字符串#模拟#真题#2026年9月#GESP202609

CCF GESP 2026年9月认证(第十五次认证)C++ 三级试题,洛谷 B4578。本题严格遵循 CCF GESP 官方大纲规范,重点考察字符串模拟与动态子串检索。题目逻辑严密,模型典型,是深入理解与掌握信奥核心考点的经典范例。

B4578 [luogu-B4578 [GESP202609 三级] 分割字符串]

🔗 洛谷原题传送门B4578

题目要求

题目描述

小明拿到了一段字符串文本,希望用下面的规则分割这个字符串:

  1. 从左到右扫描字符串,遇到第一个空格后停止,将字符串分割为左右两部分(舍弃用于分割的这个空格);
  2. 对于上次分割后右侧的字符串,继续扫描,第一次遇到连续两个空格后停止,分割为左右两部分(舍弃用于分割的这两个空格);
  3. 依此类推,小明每分割一次,下一次分割就需要更长的连续空格(第 kk 次需要连续 kk 个空格);直到字符串无法再次分割。

最后依次输出每次分割左侧的字符串,以及最后一次分割后右侧剩余的字符串。 如果字符串完全无法进行任何一次分割,直接输出其本身。

输入格式

输入一行,一个字符串(可能包含若干空格,不会以空格结尾)。

输出格式

输出若干行。每行为分割后的一个字符串。

输入输出样例

样例输入 #1
TEXT
sdfd 55 55   99312
样例输出 #1
TEXT
sdfd
55 55
 99312

说明/提示

字符串长度不超过 1000。注意若分割出的左侧为空串,需输出空行,不能省略。


题目分析与解题思路

  1. 整行读取:输入含有空格,必须使用 getline(cin, s) 完整读取一行文本。
  2. 递增匹配模式构造:维护分割轮数计数器 k=1k=1。在当前剩余字符串 s 中查找模式串 string pattern(k, ' '),即连续 kk 个空格。
  3. 子串截取与更新
    • 使用 s.find(pattern) 获取首次出现的位置 pos
    • pos == string::npos,说明无法再满足 kk 个空格的分割条件,跳出循环;
    • 若找到,左侧部分为 s.substr(0, pos)(直接输出并换行);
    • 右侧剩余部分更新为 s = s.substr(pos + k)
    • 步进 k=k+1k = k + 1 继续循环。
  4. 收尾输出:循环结束后,直接将最终剩余的字符串 s 输出即可。

完整参考代码 (C++11)

CPP
/**
 * Problem: luogu-B4578
 * Standard: C++11 (CCF GESP 官方大纲规范)
 * Author: OneCoder
 */

#include <iostream>
#include <string>

using namespace std;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    string s;
    if (!getline(cin, s)) {
        return 0;
    }

    int k = 1;
    while (true) {
        // 构造连续 k 个空格的匹配目标
        string pattern(k, ' ');
        size_t pos = s.find(pattern);
        if (pos == string::npos) {
            break;
        }

        // 输出左侧截取的子串
        string left_part = s.substr(0, pos);
        cout << left_part << "\n";

        // 更新右侧剩余字符串并递增所需空格数
        s = s.substr(pos + k);
        k++;
    }

    // 输出最终右侧剩余部分
    cout << s << "\n";

    return 0;
}

考点归纳与备考建议

  1. 考纲匹配度:严格对标 CCF GESP 三级考纲重点,绝不超纲,注重基础算法与逻辑建模规范;
  2. 规范防范:所有代码严格以 C++11 标准编译运行,针对整数溢出、边界判断、空状态均做了详尽严整的防御性处理。
💡 OneCoder 资源指引

所有代码开源上传至 GitHub:yummy-code 仓库 · GESP 专题站:GESP WIKI

🤝 技术交流与答疑

欢迎加入:C++ GESP/CSP 考级答疑群(688906745)Java/Python交流群(982860385),点击可直接加群。

📚

猜你想读 · 相关文章推荐

OneCoder

OneCoder (lihongzheshuai)

一个中年人的自留地,记录学习 C++、GESP/NOI、Java、Python 与算法架构的心得体会。本站唯一网址:coderli.com

💬 读者留言与交流

0 条讨论
✨ 支持 Markdown 语法格式
还没有留言,快来成为第一个讨论者吧!