#P9222. 「SDOI2021 三轮省集 Day2」密码[废题]
「SDOI2021 三轮省集 Day2」密码[废题]
Cannot parse: undefineds error parsing time
题目描述
本题关闭提交入口,请使用 Lemon 本地评测。
这是一道非传统题。
用户登录网站时通常需要输入密码。一般来说,在用户注册账号时,网站会要求用户设置密码,并将其存储到数据库中。当用户登录时,网站调出数据库中存储的密码与用户输入的密码进行比对。
但是作为一个合格的网站开发者,你知道如果把用户的密码直接原封不动存入数据库是一件愚蠢的行为,因为这意味着一旦数据库遭到攻击,用户的密码信息会非常容易泄露出去。因此,数据库中实际存储的一般是密码原文进行特殊处理后的结果。
具体来说,假设用户的密码原文是一个 位的 字符串,经过处理后得到一个 位 字符串并存储起来,这一步称为编码;当用户再次登录时,数据库会提取出存储的 位 字符串,并重新还原会原来的 位 字符串,与用户的输入进行对比,这一步称为解码。
同时,为了检验网站是否遭到攻击,在存储密码的环节有一定的限制: 处理后的字符串的其中某 个位置是事先给定的。这样如果某个编码后的字符串不符合这个要求,就可以判断网站遭到了攻击。
具体的 值,以及这 个具体的位置是什么,将会在编码阶段生成。但你考量再三,如果把这些信息也存入数据库,一旦泄露,这一番编码的意义将大打折扣,于是你打算在编码完成后直接销毁这些信息。但你也不得不承认,这无疑增大了解码的难度。
接下来,你的任务就是完成编码和解码工作了。
实现细节与评测方式
你不需要,也不应该实现主函数,你只需要实现函数:
void encoder(int n, int m, int k, const char* a, const char* b, char* ans);
void decoder(int n, int m, const char* a, char* ans);
其中:
encoder
函数用于编码,参数 如题目所述, 字符串 长度为 ,表示密码原文;字符串 长度为 ,其中恰有 个位置为 0
或 1
,表示事先给定的位置,其余位置均为 ?
;字符串 长度为 ,你需要用它存储编码之后的字符串。
decoder
函数用于解码,参数 如题目所述, 字符串 长度为 ,表示编码后的字符串;字符串 长度为 ,你需要用它存储解码之后的字符串。
上述字符串下标均从 开始。你只能访问上述字符串在相应长度范围内的下标,并只能修改字符串 ,不能修改其他字符串,否则可能出现意想不到的错误。
在一个测试点中,将会先执行一次 encoder
函数,再执行一次 decoder
函数。在 encoder
函数执行完后,字符串 应该为一个 位的 串,并且在事先给定的 个位置与字符串 相同,并且该字符串将会直接作为 decoder
函数传入的字符串 ;在 decoder
函数执行完后,字符串 应该为一个 位的 串,并且应该与 encoder
函数传入的字符串 相同。
你可以定义其他函数或者全局变量,但是当 encoder
函数执行完后,你定义的所有全局变量将被全部初始化。
注意:上述字符串中出现的 0
及 1
均为字符(ASCII 码分别为 和 )。
如何测试你的程序
附加文件中有三个文件:compile.bat
、encoder.cpp
和 decoder.cpp
。
你需要在本地将自己的程序命名为 password.cpp
,其中包含你编写的 encoder
和 decoder
两个函数。
将这四个程序放在同一个文件夹里,然后运行 compile.bat
即可自动进行所有文件的编译及运行。
可执行文件将从标准输入按照以下格式读入数据:
- 第一行有三个正整数 ;
- 第二行为一个长为 的 字符串,表示
encoder
函数传入的字符串 ; - 第三行为一个长为 的字符串,表示
encoder
函数传入的字符串 。
请务必确保输入数据格式符合上述要求及题面要求,否则交互库可能出现意想不到的错误。
可执行文件会输出你的程序运行正确与否的相关信息。
注意:可执行文件运行过程中会创建并使用文件 password.tmp
。
当然,如果你需要在本地进行文件输入输出操作,你可以通过适当修改 compile.bat
来实现。
样例
3 6 1
010
??1???
correct
这是使用上述测试方法和能够正确运行并输出答案的源程序得到的可能输出文件。
对于此样例,一种可能的 encoder
函数得到的 字符串为:
011001
注意:样例并不符合 的数据范围限制,因此仅供参考。直接在本地输入这组数据会显示 illegal_input
。
数据范围与评分标准
本题共 个子任务,每个子任务由多个测试点组成,你必须通过一个子任务的所有测试点才能通过该子任务。
对于每一个测试点,你的程序只有在规定的时间及空间限制内正常结束,encoder
与 decoder
函数均得到符合题目要求的 字符串才能获得满分,否则将得 分。
各个子任务的分值和数据范围如下:
子任务编号 | 分值 | 特殊性质 | |||
---|---|---|---|---|---|
无 | |||||
事先给定的位置均为 0 |
|||||
无 | |||||
对于所有的测试点,保证 ,。
注意事项
本题时限 ,空间限制 。保证对于任何合法的数据及在限制范围内的调用,交互库运行所用的。时间不会超过 ,运行所用的空间不会超过 ,也就是说,你实际可用的时间至少为 ,实际可用的空间至少为 。在实际评测中,对于 encoder
函数和 decoder
函数,上述时限和空间限制将分别计算。
交互库正常运行需包含的头文件已经给出,你的程序可以包含你需要的头文件。
注意交互库使用了 using namespace std;
,你的程序需小心可能的变量名冲突问题。
已经下发 password_sample.cpp
,你可以在此基础上编写你的程序。
为符合 lemon
评测的实际情况,本题实际评测使用的交互库与下发的交互库不完全相同。
你的程序不能进行任何读入、输出和文件操作。
通过访问输入输出文件、攻击评测系统或攻击评测库等方式得分属于作弊行为,所得分数无效。