2021年信奥赛C++提高组csp-s初赛真题及答案解析(阅读程序第3题)

2021年信奥赛C++提高组csp-s初赛真题及答案解析(阅读程序第3题)

第3题
cpp 复制代码
1 #include <iostream>
2 #include <string>
3 using namespace std;
4 
5 char base[64];
6 char table[256];
7 
8 void init()
9 {
10    for (int i = 0; i < 26; i++) base[i] = 'A' + i;
11    for (int i = 0; i < 26; i++) base[26 + i] = 'a' + i;
12    for (int i = 0; i < 10; i++) base[52 + i] = '0' + i;
13    base[62] = '+', base[63] = '/';
14 
15    for (int i = 0; i < 256; i++) table[i] = 0xff;
16    for (int i = 0; i < 64; i++) table[base[i]] = i;
17    table['='] = 0;
18 }
19 
20 string encode(string str)
21 {
22    string ret;
23    int i;
24    for (i = 0; i + 3 <= str.size(); i += 3) {
25        ret += base[str[i] >> 2];
26        ret += base[(str[i] & 0x03) << 4 | str[i + 1] >> 4];
27        ret += base[(str[i + 1] & 0x0f) << 2 | str[i + 2] >> 6];
28        ret += base[str[i + 2] & 0x3f];
29    }
30    if (i < str.size()) {
31        ret += base[str[i] >> 2];
32        if (i + 1 == str.size()) {
33            ret += base[(str[i] & 0x03) << 4];
34            ret += "==";
35        }
36        else {
37            ret += base[(str[i] & 0x03) << 4 | str[i + 1] >> 4];
38            ret += base[(str[i + 1] & 0x0f) << 2];
39            ret += "==";
40        }
41    }
42    return ret;
43 }
44 
45 string decode(string str)
46 {
47    string ret;
48    int i;
49    for (i = 0; i < str.size(); i += 4) {
50        ret += table[str[i]] << 2 | table[str[i + 1]] >> 4;
51        if (str[i + 2] != '=')
52            ret += (table[str[i + 1]] & 0x0f) << 4 | table[str[i + 2]] >> 2;
53        if (str[i + 3] != '=')
54            ret += table[str[i + 2]] << 6 | table[str[i + 3]];
55    }
56    return ret;
57 }
58 
59 int main()
60 {
61    init();
62    cout << int(table[0]) << endl;
63
64    int opt;
65    string str;
66    cin >> opt >> str;
67    cout << (opt ? decode(str) : encode(str)) << endl;
68    return 0;
69 }

假设输入总是合法的(一个整数和一个不含空白字符的字符串,用空格隔开),完成下面的判断题和单选题:

判断题
  1. 程序总是先输出 一行 一个整数,再输出 一行 一个字符串。( )

    A. 正确 B. 错误

  2. 对于任意不含空白字符的字符串str1,先执行程序输入0 str1,得到输出的第二行记为str2,再执行程序输入1 str2,输出的第二行必为str1。( )

    A. 正确 B. 错误

  3. 当输入为1 SGVsbG93b3JsZA==时,输出的第二行为HelloWorld。( )

    A. 正确 B. 错误

单选题
  1. 设输入字符串长度为 n,encode 函数的时间复杂度为( )。
    A. O( n \sqrt n n )
    B. O(n)
    C. O(nlog⁡n)
    D. O( n 2 n^2 n2)
  2. 输出的第一行为( )。
    A. 0xff
    B. 255
    C. 0xFF
    D. -1
  3. (4 分) 当输入为 0 CSP2021csp 时,输出的第二行为( )。
    A. Q1NQMjAyMWNzcAv=
    B. Q1NQMjAyMGNzcA==
    C. Q1NQMjAyMGNzcAv=
    D. Q1NQMjAyMWNzcA==

判断题答案及解析
  1. 正确 (A)

    程序执行 init() 后首先输出 int(table[0]),随后根据输入输出编码或解码结果,因此总是先输出一行整数,再输出一行字符串。

  2. 正确 (A)
    encodedecode 互为逆操作(Base64 编解码),对任意字符串先编码后解码必得原串。

  3. 错误 (B)

    输入 1 SGVsbG93b3JsZA== 解码过程:

    • SGVsbG93b3JsZA== 对应 Base64 串
    • 解码后二进制数据对应 ASCII 字符:Helloworld(注意 w 为小写)
    • 题目给出 HelloWorldW 大写),因此错误。
单选题答案及解析
  1. O(n) (B)
    encodefor 循环每轮处理 3 个字符,循环次数与输入长度 n 成正比,单次操作为常数,时间复杂度 O(n)。

  2. -1 (D)
    table[0]init() 中被赋值为 0xff,在 char 为有符号类型的实现中,0xff 表示 -1,强制转为 int 输出 -1。

  3. Q1NQMjAyMWNzcA== (D)

    对字符串 "CSP2021csp" 进行 Base64 编码:

    • 分组:CSPQ1NQ202MjAy1csMWNzp 结尾补 ==
    • 拼接得 Q1NQMjAyMWNzcA==(注意与选项 D 一致,选项 B 为 Q1NQMjAyMGNzcA==,年份误为 2020,因此排除)。

专栏推荐:信奥赛C++提高组csp-s初赛&复赛真题题解(持续更新)
https://blog.csdn.net/weixin_66461496/category_13125089.html


各种学习资料,助力大家一站式学习和提升!!!

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
int main(){
	cout<<"##########  一站式掌握信奥赛知识!  ##########";
	cout<<"#############  冲刺信奥赛拿奖!  #############";
	cout<<"######  课程购买后永久学习,不受限制!   ######";
	return 0;
}

1、csp信奥赛高频考点知识详解及案例实践:

CSP信奥赛C++动态规划:
https://blog.csdn.net/weixin_66461496/category_13096895.html点击跳转

CSP信奥赛C++标准模板库STL:
https://blog.csdn.net/weixin_66461496/category_13108077.html 点击跳转

信奥赛C++提高组csp-s知识详解及案例实践:
https://blog.csdn.net/weixin_66461496/category_13113932.html

2、csp信奥赛冲刺一等奖有效刷题题解:

CSP信奥赛C++初赛及复赛高频考点真题解析(持续更新):https://blog.csdn.net/weixin_66461496/category_12808781.html 点击跳转

CSP信奥赛C++一等奖通关刷题题单及题解(持续更新):https://blog.csdn.net/weixin_66461496/category_12673810.html 点击跳转

信奥赛C++提高组csp-s初赛&复赛真题题解(持续更新)
https://blog.csdn.net/weixin_66461496/category_13125089.html

3、GESP C++考级真题题解:

GESP(C++ 一级+二级+三级)真题题解(持续更新):https://blog.csdn.net/weixin_66461496/category_12858102.html 点击跳转

GESP(C++ 四级+五级+六级)真题题解(持续更新):https://blog.csdn.net/weixin_66461496/category_12869848.html 点击跳转

GESP(C++ 七级+八级)真题题解(持续更新):
https://blog.csdn.net/weixin_66461496/category_13117178.html

4、CSP信奥赛C++竞赛拿奖视频课:

https://edu.csdn.net/course/detail/40437 点击跳转

· 文末祝福 ·

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
int main(){
	cout<<"跟着王老师一起学习信奥赛C++";
	cout<<"    成就更好的自己!       ";
	cout<<"  csp信奥赛一等奖属于你!   ";
	return 0;
}
相关推荐
colicode2 小时前
Objective-C语音验证码接口API示例代码:老版iOS应用接入语音验证教程
前端·c++·ios·前端框架·objective-c
犽戾武2 小时前
在 Quest 上用 OpenXR + MediaCodec + OES 外部纹理做一个“低延迟视频面板”(48小时的编码复盘)
linux·c++·嵌入式硬件·vr
犽戾武2 小时前
准备工作:OpenXR Sample 示例工程“去掉 UI 渲染”& RK3588→Windows 低延迟 UDP 视频链路
linux·c++·ubuntu·vr
王老师青少年编程2 小时前
2021年信奥赛C++提高组csp-s初赛真题及答案解析(阅读程序第2题)
c++·题解·真题·初赛·信奥赛·csp-s·提高组
生活很暖很治愈2 小时前
Linux——线程异常
linux·c++·ubuntu
生活很暖很治愈2 小时前
Linux——线程概念&控制&创建&等待
linux·服务器·c++·ubuntu
REDcker2 小时前
FFmpeg完整文档
linux·服务器·c++·ffmpeg·音视频·c·后端开发
你好!蒋韦杰-(烟雨平生)3 小时前
opengl阴影实现
c++·数学·游戏·3d
仰泳的熊猫3 小时前
题目 1473: 蓝桥杯基础练习VIP-芯片测试
数据结构·c++·算法·蓝桥杯