题解:洛谷 AT_abc436_a o-padding

【题目来源】

洛谷:AT_abc436_a [ABC436A] o-padding - 洛谷

【题目描述】

给定一个整数 \(N\) 和一个只包含小写英文字母的字符串 \(S\),其中 \(S\) 的长度小于 \(N\)

请输出一个新的字符串,该字符串通过不断在 \(S\) 的开头添加小写字母 o,直到其长度变为 \(N\) 为止。

【输入】

输入通过标准输入给出,格式如下:

\(N\) \(S\)

【输出】

输出答案。

【输入样例】

5
abc

【输出样例】

ooabc

【核心思想】

  1. 问题分析:给定目标长度 \(N\) 和一个长度小于 \(N\) 的字符串 \(S\),需要在 \(S\) 的开头不断添加字符 o,直到字符串长度恰好为 \(N\)。这是一个字符串构造/直接模拟问题,关键在于计算需要补充的 o 的个数并控制输出顺序。

  2. 算法选择

    • 直接构造:计算需要补充的字符数 \(N - |S|\),先输出对应数量的 o,再输出原字符串 \(S\)
  3. 关键步骤

    • 读取输入:读入整数 \(N\) 和字符串 \(S\)
    • 计算缺口\(need = N - |S|\),即需要补充的 o 的个数
    • 输出填充字符:循环 \(need\) 次,每次输出一个 o
    • 输出原字符串:输出 \(S\)
    • 换行结束
  4. 时间/空间复杂度

    • 时间复杂度:\(O(N)\),输出 \(N\) 个字符
    • 空间复杂度:\(O(1)\),无需额外存储(若不考虑输入字符串本身)
  5. 字符串构造的核心思想

    • 顺序控制:由于只能在开头添加,必须先输出填充字符再输出原串,体现"先补后原"的构造顺序
    • 长度守恒:最终长度严格等于 \(N\),通过 \(N - |S|\) 精确控制填充量
    • 适用于规则明确的字符串格式化与构造类问题

【算法标签】

入门 #字符串入门

【代码详解】

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

int n;          // 总长度
string s;       // 输入的字符串

int main()
{
    // 输入总长度n和字符串s
    cin >> n >> s;

    // 在字符串前面补充字符'o',使总长度达到n
    // 需要补充的'o'个数为:n - s.size()
    for (int i = 1; i <= n - s.size(); i++)
    {
        cout << "o";  // 输出字符'o'
    }

    // 输出原始字符串s
    cout << s << endl;

    return 0;
}

【运行结果】

5
abc
ooabc
posted @ 2026-08-27 11:03  团爸讲算法  阅读(3)  评论(0)    收藏  举报