#P9222. 「SDOI2021 三轮省集 Day2」密码[废题]

「SDOI2021 三轮省集 Day2」密码[废题]

Cannot parse: undefineds error parsing time

题目描述

本题关闭提交入口,请使用 Lemon 本地评测。

这是一道非传统题。

用户登录网站时通常需要输入密码。一般来说,在用户注册账号时,网站会要求用户设置密码,并将其存储到数据库中。当用户登录时,网站调出数据库中存储的密码与用户输入的密码进行比对。

但是作为一个合格的网站开发者,你知道如果把用户的密码直接原封不动存入数据库是一件愚蠢的行为,因为这意味着一旦数据库遭到攻击,用户的密码信息会非常容易泄露出去。因此,数据库中实际存储的一般是密码原文进行特殊处理后的结果。

具体来说,假设用户的密码原文是一个 nn 位的 0101 字符串,经过处理后得到一个 mm0101 字符串并存储起来,这一步称为编码;当用户再次登录时,数据库会提取出存储的 mm0101 字符串,并重新还原会原来的 nn0101 字符串,与用户的输入进行对比,这一步称为解码。

同时,为了检验网站是否遭到攻击,在存储密码的环节有一定的限制: 处理后的字符串的其中某 kk 个位置是事先给定的。这样如果某个编码后的字符串不符合这个要求,就可以判断网站遭到了攻击。

具体的 kk 值,以及这 kk 个具体的位置是什么,将会在编码阶段生成。但你考量再三,如果把这些信息也存入数据库,一旦泄露,这一番编码的意义将大打折扣,于是你打算在编码完成后直接销毁这些信息。但你也不得不承认,这无疑增大了解码的难度。

接下来,你的任务就是完成编码和解码工作了。

实现细节与评测方式

你不需要,也不应该实现主函数,你只需要实现函数:

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 函数用于编码,参数 n,m,kn, m, k 如题目所述,0101 字符串 aa 长度为 nn,表示密码原文;字符串 bb 长度为 mm,其中恰有 kk 个位置为 01,表示事先给定的位置,其余位置均为 ?;字符串 ansans 长度为 mm,你需要用它存储编码之后的字符串。

decoder 函数用于解码,参数 n,mn, m 如题目所述,0101 字符串 aa 长度为 mm,表示编码后的字符串;字符串 ansans 长度为 nn,你需要用它存储解码之后的字符串。

上述字符串下标均从 00 开始。你只能访问上述字符串在相应长度范围内的下标,并只能修改字符串 ansans,不能修改其他字符串,否则可能出现意想不到的错误。

在一个测试点中,将会先执行一次 encoder 函数,再执行一次 decoder 函数。在 encoder 函数执行完后,字符串 ansans 应该为一个 mm 位的 0101 串,并且在事先给定的 kk 个位置与字符串 bb 相同,并且该字符串将会直接作为 decoder 函数传入的字符串 aa;在 decoder 函数执行完后,字符串 ansans 应该为一个 nn 位的 0101 串,并且应该与 encoder 函数传入的字符串 aa 相同。

你可以定义其他函数或者全局变量,但是当 encoder 函数执行完后,你定义的所有全局变量将被全部初始化。

注意:上述字符串中出现的 01 均为字符(ASCII 码分别为 48484949)。

如何测试你的程序

附加文件中有三个文件:compile.batencoder.cppdecoder.cpp

你需要在本地将自己的程序命名为 password.cpp,其中包含你编写的 encoderdecoder 两个函数。

将这四个程序放在同一个文件夹里,然后运行 compile.bat 即可自动进行所有文件的编译及运行。

可执行文件将从标准输入按照以下格式读入数据:

  • 第一行有三个正整数 n,m,kn,m,k
  • 第二行为一个长为 nn0101 字符串,表示 encoder 函数传入的字符串 aa
  • 第三行为一个长为 mm 的字符串,表示 encoder 函数传入的字符串 bb

请务必确保输入数据格式符合上述要求及题面要求,否则交互库可能出现意想不到的错误。

可执行文件会输出你的程序运行正确与否的相关信息。

注意:可执行文件运行过程中会创建并使用文件 password.tmp

当然,如果你需要在本地进行文件输入输出操作,你可以通过适当修改 compile.bat 来实现。

样例

3 6 1
010
??1???
correct

这是使用上述测试方法和能够正确运行并输出答案的源程序得到的可能输出文件。

对于此样例,一种可能的 encoder 函数得到的 ansans 字符串为:

011001

注意:样例并不符合 mm 的数据范围限制,因此仅供参考。直接在本地输入这组数据会显示 illegal_input

数据范围与评分标准

本题共 66 个子任务,每个子任务由多个测试点组成,你必须通过一个子任务的所有测试点才能通过该子任务。

对于每一个测试点,你的程序只有在规定的时间及空间限制内正常结束,encoderdecoder 函数均得到符合题目要求的 ansans 字符串才能获得满分,否则将得 00 分。

各个子任务的分值和数据范围如下:

子任务编号 分值 nn\le kk\le m=m= 特殊性质
11 1010 1010 11 7070
22 1515 55 100100
33 5050 2020 300300 事先给定的位置均为 0
44 200200 5050 500500
55 2020 10310^3 1010 1.5×1031.5\times 10^3
66 2525 10310^3 20502050

对于所有的测试点,保证 1n,k1031\le n,k\le 10^3n+k+50m2050n+k+50\le m\le 2050

注意事项

本题时限 2s2s,空间限制 512MB512MB。保证对于任何合法的数据及在限制范围内的调用,交互库运行所用的。时间不会超过 0.5s0.5s,运行所用的空间不会超过 64MB64MB,也就是说,你实际可用的时间至少为 1.5s1.5s,实际可用的空间至少为 448MB448MB。在实际评测中,对于 encoder 函数和 decoder 函数,上述时限和空间限制将分别计算。

交互库正常运行需包含的头文件已经给出,你的程序可以包含你需要的头文件。

注意交互库使用了 using namespace std;,你的程序需小心可能的变量名冲突问题。

已经下发 password_sample.cpp,你可以在此基础上编写你的程序。

为符合 lemon 评测的实际情况,本题实际评测使用的交互库与下发的交互库不完全相同。

你的程序不能进行任何读入、输出和文件操作。

通过访问输入输出文件、攻击评测系统或攻击评测库等方式得分属于作弊行为,所得分数无效。