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 }
假设输入总是合法的(一个整数和一个不含空白字符的字符串,用空格隔开),完成下面的判断题和单选题:
判断题
-
程序总是先输出 一行 一个整数,再输出 一行 一个字符串。( )
A. 正确 B. 错误
-
对于任意不含空白字符的字符串
str1,先执行程序输入0 str1,得到输出的第二行记为str2,再执行程序输入1 str2,输出的第二行必为str1。( )A. 正确 B. 错误
-
当输入为
1 SGVsbG93b3JsZA==时,输出的第二行为HelloWorld。( )A. 正确 B. 错误
单选题
- 设输入字符串长度为 n,
encode函数的时间复杂度为( )。
A. O( n \sqrt n n )
B. O(n)
C. O(nlogn)
D. O( n 2 n^2 n2) - 输出的第一行为( )。
A.0xff
B.255
C.0xFF
D.-1 - (4 分) 当输入为
0 CSP2021csp时,输出的第二行为( )。
A.Q1NQMjAyMWNzcAv=
B.Q1NQMjAyMGNzcA==
C.Q1NQMjAyMGNzcAv=
D.Q1NQMjAyMWNzcA==
判断题答案及解析
-
正确 (A)
程序执行
init()后首先输出int(table[0]),随后根据输入输出编码或解码结果,因此总是先输出一行整数,再输出一行字符串。 -
正确 (A)
encode与decode互为逆操作(Base64 编解码),对任意字符串先编码后解码必得原串。 -
错误 (B)
输入
1 SGVsbG93b3JsZA==解码过程:SGVsbG93b3JsZA==对应 Base64 串- 解码后二进制数据对应 ASCII 字符:
Helloworld(注意w为小写) - 题目给出
HelloWorld(W大写),因此错误。
单选题答案及解析
-
O(n) (B)
encode中for循环每轮处理 3 个字符,循环次数与输入长度 n 成正比,单次操作为常数,时间复杂度 O(n)。 -
-1 (D)
table[0]在init()中被赋值为0xff,在char为有符号类型的实现中,0xff表示 -1,强制转为int输出 -1。 -
Q1NQMjAyMWNzcA==(D)对字符串
"CSP2021csp"进行 Base64 编码:- 分组:
CSP→Q1NQ,202→MjAy,1cs→MWNz,p结尾补== - 拼接得
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;
}