题目描述
为了防止攻击者通过穷举口令破解登陆系统,通常会在口令错误的情况下增加等待时间。
系统提供三次冷却时间为0的机会。即前三次尝试输入口令前,均无需等待任何时间。而在第四次尝试输入口令前,系统让用户强制等待 1 分钟。若第四次仍旧匹配不成功,在第五次尝试输入前,系统会令使用者强制等待 2 分钟,以此类推。之后每次输入口令之前,均会等待2倍于之前的时间。
该系统最多提供十次口令输入机会,若第十次输入依然错误,用户将被锁定,显示 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
题解
本题关键点:用模拟法进行解题,用pow函数计算错误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;
}