P17037 [NWERC 2021] 拒绝访问 / Access Denied
题目背景
译自 [Northwestern Europe Regional Contest (NWERC) 2021](http://2021.nwerc.eu) Problem A。
原题许可协议为 CC BY-SA。
题目描述
计算机密码已经存在很久了。事实上,$60$ 年前,[CTSS](https://en.wikipedia.org/wiki/Compatible_Time-Sharing_System) 是最早使用密码的计算机系统之一。它的实现非常简单:在 CTSS 中,密码以明文形式存储在磁盘上的一个文件里。登录时,用户输入一个密码,计算机会将它与磁盘上的密码进行比较。如果比较失败,就拒绝访问;如果比较成功,就允许访问。MIT 的研究人员很快发现了这个密码系统中的若干安全漏洞。我们将研究其中一种:计时攻击。
在计时攻击中,我们利用“完成一次计算所花的时间”来推断计算过程经过了哪些路径。在 CTSS 中,密码检查使用一个简单的字符串匹配算法,类似于下面这样:
```text
bool CheckPassword(string pwd1, string pwd2) {
if (pwd1.Length != pwd2.Length) {
return false;
}
for (int i = 0; i < pwd1.Length; i++) {
if (pwd1[i] != pwd2[i]) {
return false;
}
}
return true;
}
```
在本题中,我们将使用上述算法以及一个(非常)简化的计时模型。计时模型如下:
- 一个分支语句(`if` 或 `for`)耗时 $1$ ms。
- 一次赋值,或一次内存地址的更新,耗时 $1$ ms。
- 两个内存地址之间的一次比较耗时 $3$ ms。
- 一个 `return` 语句耗时 $1$ ms。
密码由 $1$ 到 $20$ 个英文字母(大写或小写)和数字组成。
### 交互格式
这是一道交互题。你的程序会与一个 **交互器** 一起运行;交互器读取你程序的标准输出,并向你程序的标准输入写入内容。交互过程必须遵循以下协议:
- 你的程序首先输出一个密码字符串,该字符串由 $1$ 到 $20$ 个英文字母(大写或小写)和数字组成。
- 根据密码是否正确,交互器随后会返回以下两种内容之一:
- 如果密码正确,返回 `ACCESS GRANTED`。此时你的程序应当正常退出。
- 如果密码错误,返回 `ACCESS DENIED ($t$ ms)`,其中 $t$ 是验证该密码所花费的时间,单位为 ms。之后你的程序可以继续进行下一次猜测。
每次写入后请确保刷新输出缓冲区。你最多可以猜测 $2\,500$ 次。题包中提供了一个测试工具,帮助你调试程序。
输入格式
无
输出格式
无
说明/提示
【数据规模与约定】
对于所有数据,密码长度满足 $1 \le |s| \le 20$,字符只包含英文字母(大小写)和数字。最多允许 $2\,500$ 次猜测。