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;
}
相关推荐
努力努力再努力wz17 分钟前
【Linux网络系列】深入理解 I/O 多路复用:从 select 痛点到 poll 高并发服务器落地,基于 Poll、智能指针与非阻塞 I/O与线程池手写一个高性能 HTTP 服务器!(附源码)
java·linux·运维·服务器·c语言·c++·python
努力努力再努力wz20 分钟前
【Linux网络系列】万字硬核解析网络层核心:IP协议到IP 分片重组、NAT技术及 RIP/OSPF 动态路由全景
java·linux·运维·服务器·数据结构·c++·python
minji...33 分钟前
Linux 线程同步与互斥(四) POSIX信号量,基于环形队列的生产者消费者模型
linux·运维·服务器·c语言·开发语言·c++
王老师青少年编程1 小时前
csp信奥赛C++高频考点专项训练之贪心算法 --【排序贪心】:拼数
c++·算法·贪心·csp·信奥赛·排序贪心·拼数
程序猿编码1 小时前
给Linux程序穿“隐身衣”——ELF运行时加密器全解析(C/C++代码实现)
linux·c语言·c++·网络安全·elf·内存安全
John_ToDebug1 小时前
从 Win10 到 Win11 22H2+:任务栏美化中的“蒙版”和“Hover 色块”渲染原理解析
c++·chrome·windows
谭欣辰2 小时前
AC自动机:多模式匹配的高效利器
数据结构·c++·算法
三月微暖寻春笋2 小时前
【和春笋一起学C++】(六十三)虚函数特性(二)
c++·基类·派生类·虚函数特性
历程里程碑2 小时前
MySQL事务深度解析:ACID到MVCC实战+万字长文解析
开发语言·数据结构·数据库·c++·sql·mysql·排序算法
鲸渔2 小时前
【C++ 跳转语句】break、continue、goto 与 return
开发语言·c++·算法