CCF-GESP计算机学会等级考试2026年6月三级C++T1 加密

发布时间:2026/7/1 17:57:32
CCF-GESP计算机学会等级考试2026年6月三级C++T1 加密 B4555 [GESP202606 三级] 加密题目描述小杨同学有一串数字想把它们变成另一串数字这个过程叫做加密。他有一本密码本密码本告诉你每个数字应该变成哪个数字。数字一共有101010个000、111、222、333、444、555、666、777、888、999。密码本会依次告诉你000要变成什么111要变成什么222要变成什么……999要变成什么请你按照密码本把原来的每个数字都换成新的数字然后输出。输入格式输入共有333行。第一行一个整数表示有多少个数字需要加密第二行这些需要加密的数字第三行密码本一共101010个数字。这101010个数字的意思是第111个数字表示000加密后变成什么第222个数字表示111加密后变成什么第333个数字表示222加密后变成什么……第101010个数字表示999加密后变成什么。输出格式输出加密后的数字。也就是把输入第二行里的每个数字都按照输入第三行的密码本换掉后输出。输入输出样例 #1输入 #17 0 2 0 3 4 1 9 9 0 1 2 3 4 5 6 7 8输出 #19 1 9 2 3 0 8说明/提示第二行要加密的数字是0 2 0 3 4 1 90 \ 2 \ 0 \ 3 \ 4 \ 1 \ 90203419第三行密码本是9 0 1 2 3 4 5 6 7 89 \ 0 \ 1 \ 2 \ 3 \ 4 \ 5 \ 6 \ 7 \ 89012345678它的意思是000变成999111变成000222变成111333变成222444变成333555变成444666变成555777变成666888变成777999变成888所以000变成999222变成111000变成999333变成222444变成333111变成000999变成888最后得到9 1 9 2 3 0 89 \ 1 \ 9 \ 2 \ 3 \ 0 \ 89192308数据范围需要加密的数字个数不超过200002000020000个且均为000到999密码本中的数字不重复且均为000到999。题解这道题是简单的映射替换问题。我只需要读入待加密的数字序列和密码本然后按照密码本中规定的映射关系将每个原数字替换成对应的新数字即可。解题步骤非常直接读入需要加密的数字个数n。读入这n个数字存入数组b下标从 1 开始方便对应位置。读入密码本共 10 个数字存入数组a其中a[i]表示数字i加密后变成的数字因为密码本第 1 个对应 0第 2 个对应 1……第 10 个对应 9所以直接按顺序读入到a[0]到a[9]即可。遍历每个待加密数字b[i]输出a[b[i]]即用原数字作为下标去密码本中查找替换结果数字之间用空格隔开。时间复杂度为 O(n)n 最大 20000完全可行空间复杂度为 O(n 10)非常小。注意事项密码本中的数字不重复且均为 0~9因此无需额外校验。输出格式要求每个加密后的数字之间用空格分隔末尾可以有一个空格不影响评测但规范起见保留。带注释的源代码#includebits/stdc.husingnamespacestd;intn;// 需要加密的数字个数inta[10];// 密码本a[i] 表示数字 i 加密后变成的数字intb[20005];// 存储待加密的原始数字序列intmain(){cinn;// 读入数字个数// 读入待加密的数字序列for(inti1;in;i){cinb[i];}// 读入密码本共 10 个数字依次对应 0~9 的加密结果for(inti0;i10;i){cina[i];}// 依次对每个原始数字进行加密并输出结果for(inti1;in;i){// 原数字 b[i] 加密后为 a[b[i]]输出并用空格分隔couta[b[i]] ;}return0;}