Advertisement

上海计算机学会2022年6月月赛C++丙组T2解锁口令

阅读量:
题目描述

为了避免攻击者通过暴力破解攻击来破坏系统,在口令错误时会延长响应时间

该系统设置前三次冷却周期均为零。在前三次尝试输入口令前,则无需任何等待时间。在第四次尝试输入口令之前,则需要求用户等待一分钟。若第四次仍无法匹配成功,在第五次尝试之前,则需要求用户等待两分钟。之后每次输入口令之前,则会 waiting two times the previous interval.

该系统最大允许提供十个登录次数机会,在第十次尝试仍然无效的情况下,用户将被禁用,并在控制台输出 Locked

基于正确的密码设置,并且在用户的每一次输入操作中,请计算一下用户的总等待时间

输入格式
  • 第一行是一个单一字符串表示正确的密码。
  • 接下来的多个行中每一行都包含一个单独的字符串表示用户的解锁尝试。
  • 用户可以在输入正确的密码时成功解锁设备。
  • 如果用户输入错误的密码十次后系统会锁定该设备不再接受进一步操作。
输出格式

输出用户的总等待时间,若因连续十次输入错误导致锁定,则输出Locked

数据范围

数据校验中要求真实密码和输入的密码仅包含大写字母、小写字母以及数字字符。

样例数据

输入:

Abcd1234
abcd1234
Abcd1234

输出:

0

说明:

正确密码为Abcd1234。
第二次输入密码正确,故不用等待

输入:

Abcd1234
abcd1234
abcd1345
aaaa1111
abcd4321
Abcd1234

输出:

3

说明:

第四次输入前,等待了一分钟
第五次输入前,等待了两分钟
故共等待3分钟

输入:

Abcd1234
abcd1234
abcd1234
abcd1234
abcd1234
abcd1234
abcd1234
abcd1234
abcd1234
abcd1234
abcd1234

输出:

Locked

题解

本题关键点:采用模拟法来解答问题,在计算错误次数超过3次时每次等待时间构成一个首项为2的等比数列的具体实现见下文。代码如下

复制代码
 #include <iostream>

    
 #include <cmath>
    
 using namespace std;
    
 int main() {
    
     string pwd, input;
    
     cin >> pwd;
    
     for (int i = 1; i <= 10; i++) {
    
     cin >> input;
    
     if (pwd == input) {
    
         if (i <= 3) {
    
             cout << 0<<endl;
    
         } else {
    
             cout << int(pow(2, i - 3) - 1)<<endl;
    
         }
    
         return 0;
    
     }
    
     }
    
     cout << "Locked"<<endl;
    
     return 0;
    
 }

全部评论 (0)

还没有任何评论哟~