202606-加密(luogu-B4555)

202606-加密(luogu-B4555)

GESP C++三级,2026年6月真题,数组映射,难度⭐,洛谷难度入门

luogu-B4555 [GESP202606 三级] 加密

题目要求

题目描述

小杨同学有一串数字,想把它们变成另一串数字,这个过程叫做加密

他有一本密码本,密码本告诉你:每个数字应该变成哪个数字。

数字一共有 1010 个:00112233445566778899

密码本会依次告诉你:00 要变成什么,11 要变成什么,……,99 要变成什么。

请你按照密码本,把原来的每个数字都换成新的数字,然后输出。

输入格式

输入共有 33 行。

第一行:一个整数,表示有多少个数字需要加密;

第二行:这些需要加密的数字;

第三行:密码本,一共 1010 个数字。第 11 个数字表示 00 加密后变成什么,第 22 个数字表示 11 加密后变成什么,……,第 1010 个数字表示 99 加密后变成什么。

输出格式

输出加密后的数字,即把输入第二行里的每个数字,都按照密码本替换后输出。

输入输出样例 #1

输入 #1

7
0 2 0 3 4 1 9
9 0 1 2 3 4 5 6 7 8

输出 #1

9 1 9 2 3 0 8

说明/提示

密码本 9 0 1 2 3 4 5 6 7 89\ 0\ 1\ 2\ 3\ 4\ 5\ 6\ 7\ 8 的含义为:090 \to 9101 \to 0212 \to 1323 \to 2434 \to 3545 \to 4656 \to 5767 \to 6878 \to 7989 \to 8

因此原数字 0 2 0 3 4 1 90\ 2\ 0\ 3\ 4\ 1\ 9 加密后为 9 1 9 2 3 0 89\ 1\ 9\ 2\ 3\ 0\ 8

数据范围

需要加密的数字个数不超过 2000020000 个,且均为 0099;密码本中的数字不重复,且均为 0099


题目分析

解题思路

本题的解题思路如下:

  1. 问题本质:

    • 给定一个长度为 1010 的数组作为密码本,其中 map[i] 表示数字 ii 加密后对应的数字
    • 对输入的每个数字,查表替换后输出
  2. 解题关键 — 数组下标映射:

    • 用一个大小为 1010 的数组 map[0..9] 存储密码本
    • 读入密码本后,map[i] 即为数字 ii 加密后的结果
    • 对于每个待加密的数字 xx,直接输出 map[x] 即可
  3. 复杂度分析:

    • 时间复杂度:O(n)O(n),其中 nn 为待加密的数字个数,每个数字只需一次数组查表
    • 空间复杂度:O(1)O(1),只需一个大小为 1010 的数组

示例代码

利用数组下标天然对应数字 0099 的特性,直接建立映射表并逐个替换输出。

#include <iostream>

int main() {
    // 读入待加密的数字个数
    int n;
    std::cin >> n;
    // 读入待加密的数字,存入数组
    int a[20000];
    for (int i = 0; i < n; i++) {
        std::cin >> a[i];
    }
    // 读入密码本,map[i] 表示数字 i 加密后变成 map[i]
    int map[10];
    for (int i = 0; i < 10; i++) {
        std::cin >> map[i];
    }
    // 逐个替换并输出
    for (int i = 0; i < n; i++) {
        // 通过数组下标直接查表得到加密后的数字
        std::cout << map[a[i]];
        // 数字之间用空格分隔
        if (i < n - 1) {
            std::cout << " ";
        }
    }
    std::cout << std::endl;
    return 0;
}

本文由coderli.com原创,按照CC BY-NC-SA 4.0 进行授权

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

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

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

GESP/CSP认证交流QQ群: 688906745

GESP/CSP 认证学习微信公众号
GESP/CSP 认证学习微信公众号
最后更新于