#P17037. [NWERC 2021] Access Denied

    ID: 19330 远端评测题 1000ms 512MiB 尝试: 0 已通过: 0 难度: 5 上传者: 标签>模拟2021交互题Special Judge构造ICPC

[NWERC 2021] Access Denied

背景

译自 Northwestern Europe Regional Contest (NWERC) 2021 Problem A。

原题许可协议为 CC BY-SA。

题目描述

计算机密码已经存在很久了。事实上,6060 年前,CTSS 是最早使用密码的计算机系统之一。它的实现非常简单:在 CTSS 中,密码以明文形式存储在磁盘上的一个文件里。登录时,用户输入一个密码,计算机会将它与磁盘上的密码进行比较。如果比较失败,就拒绝访问;如果比较成功,就允许访问。MIT 的研究人员很快发现了这个密码系统中的若干安全漏洞。我们将研究其中一种:计时攻击。

在计时攻击中,我们利用“完成一次计算所花的时间”来推断计算过程经过了哪些路径。在 CTSS 中,密码检查使用一个简单的字符串匹配算法,类似于下面这样:

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;
}

在本题中,我们将使用上述算法以及一个(非常)简化的计时模型。计时模型如下:

  • 一个分支语句(iffor)耗时 11 ms。
  • 一次赋值,或一次内存地址的更新,耗时 11 ms。
  • 两个内存地址之间的一次比较耗时 33 ms。
  • 一个 return 语句耗时 11 ms。

密码由 112020 个英文字母(大写或小写)和数字组成。

交互格式

这是一道交互题。你的程序会与一个 交互器 一起运行;交互器读取你程序的标准输出,并向你程序的标准输入写入内容。交互过程必须遵循以下协议:

  • 你的程序首先输出一个密码字符串,该字符串由 112020 个英文字母(大写或小写)和数字组成。
  • 根据密码是否正确,交互器随后会返回以下两种内容之一:
    • 如果密码正确,返回 ACCESS GRANTED。此时你的程序应当正常退出。
    • 如果密码错误,返回 ACCESS DENIED ($t$ ms),其中 tt 是验证该密码所花费的时间,单位为 ms。之后你的程序可以继续进行下一次猜测。

每次写入后请确保刷新输出缓冲区。你最多可以猜测 25002\,500 次。题包中提供了一个测试工具,帮助你调试程序。

ACCESS DENIED (5 ms)
ACCESS DENIED (41 ms)
ACCESS DENIED (68 ms)
ACCESS GRANTED
A
HunFhun
Hunter1
Hunter2

提示

【数据规模与约定】

对于所有数据,密码长度满足 1s201 \le |s| \le 20,字符只包含英文字母(大小写)和数字。最多允许 25002\,500 次猜测。