文章

【CSP】CSP-XL 2025辽宁复赛真题-第一题, 字符串数数(count)(字符串考点,相当于GESP三级)

CSP-XL 2025辽宁复赛真题-第一题,字符串考点,相当于GESP三级,难度⭐★☆☆☆。

CSP-XL 2025辽宁复赛真题-第一题, 字符串数数(count)

题目要求

题目描述 输入输出格式


题目分析

解题思路

  1. 题意梳理
    给定一个仅由小写字母构成的字符串,要求统计每个字母出现的次数,并按字母表顺序依次输出 26 行结果。
    共 26 行,第 1 行是 a 的个数,第 2 行是 b 的个数,其余字母均为 0。

  2. 算法选择
    • 开一个长度为 26 的整型数组 cnt,初始全 0。
    • 遍历字符串,对字符 c 执行 cnt[c-'a']++
    • 最后顺序输出 cnt[0..25],每行一个数字。
  3. 复杂度分析
    字符串长度为 $n$($n\le 10^5$ 量级)。
    • 时间复杂度:$O(n + 26)$,线性扫描一次字符串,再输出 26 个数。
    • 空间复杂度:$O(26)$,仅使用一个固定大小的计数数组。
  4. 边界与细节
    • 输入可能为空串,此时 26 行全为 0。
    • 输出严格按 a~z 顺序,不能遗漏、不能多行、不能带额外空格。
    • 使用 freopen 读写文件,符合复赛要求。


示例代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>

int count_ary[26] = {};          // 初始化26个字母的计数数组,全部置0
int main() {
    freopen("count.in", "r", stdin);   // 重定向标准输入,从文件count.in读取数据
    freopen("count.out", "w", stdout); // 重定向标准输出,结果写入count.out
    std::string str;                   // 存储输入的字符串
    std::cin >> str;                   // 读取字符串
    // 遍历字符串,统计每个小写字母出现次数
    for (int i = 0; i < str.length(); i++) {
        count_ary[str[i] - 'a']++;     // 将字符映射到0~25,对应计数器加1
    }
    // 按字母顺序输出26个计数,每行一个
    for (int i = 0; i < 26; i++) {
        std::cout << count_ary[i] << "\n";
    }
    return 0;                          // 程序正常结束
}

所有代码已上传至Github:https://github.com/lihongzheshuai/yummy-code

GESP 学习专题站:GESP WIKI

luogu-”系列题目可在洛谷题库进行在线评测。

bcqm-”系列题目可在编程启蒙题库进行在线评测。

欢迎加入Java、C++、Python技术交流QQ群(982860385),大佬免费带队,有问必答

欢迎加入C++ GESP/CSP认证学习QQ频道,考试资源总结汇总

欢迎加入C++ GESP/CSP学习交流QQ群(688906745),考试认证学员交流,互帮互助

GESP/CSP 认证学习微信公众号
GESP/CSP 认证学习微信公众号
本文由作者按照 CC BY-NC-SA 4.0 进行授权