CCFCSP备考第二天
第35次认证第一题——密码
时间限制: 1.0 秒
空间限制: 512 MiB
相关文件: 题目目录(样例文件)
题目背景
西西艾弗网对用户密码有一套安全级别评定标准。
题目描述
在西西艾弗网上,用户的密码是一个由大写字母(A-Z
)、小写字母(a-z
)、数字(0-9
)和特殊字符(*
和 #
)共 64 种字符组成的字符串。
根据复杂程度不同,密码安全度被分为高、中、低三档。
-
高:由上述 64 种字符组成,长度大于等于 6 个字符,包含字母、数字和特殊字符,同一个字符出现不超过 2 次;
-
中:由上述 64 种字符组成,长度大于等于 6 个字符,包含字母、数字和特殊字符,且未达到高安全度要求;
-
低:由上述 64 种字符组成,长度大于等于 6 个字符,且未达到中安全度要求;
小 P 为自己准备了 n 个候选密码,试编写程序帮小 P 自动判别每个密码的安全级别。保证这 n 个密码都至少满足低安全度要求,当安全度为高、中、低时分别输出 2
、1
、0
即可。
输入格式
从标准输入读入数据。
输入共 n+1 行。
第一行包含一个正整数 n,表示待判别的密码个数;
接下来 n 行,每行一个字符串,表示一个安全度至少为低的候选密码。
输出格式
输出到标准输出。
输出共 n 行,每行输出一个整数 2
、1
或 0
,表示对应密码的安全度。
样例输入
4
csp#ccsp
csp#ccsp2024
Csp#ccsp2024
CSP#2024
样例输出
0
1
2
2
样例解释
第一个密码不含数字,安全度为低;
第二个密码中小写字母 c
出现 3 次,安全度为中;
和第二个密码相比,第三个密码把一个小写字母 c
变为了大写,满足了高安全度要求;
第四个密码同样满足高安全度要求。
子任务
全部的测试数据满足 n≤100,且输入的每个字符串均不超过 20 个字符。
语言和编译选项
# | 名称 | 编译器 | 额外参数 | 代码长度限制 |
---|---|---|---|---|
0 | g++ | g++ | -O2 -DONLINE_JUDGE | 65536 B |
1 | gcc | gcc | -O2 -DONLINE_JUDGE | 65536 B |
2 | java | javac | 65536 B | |
3 | python3 | python3 | 65536 B |
相关知识点复习
关键知识点总结
-
字符串输入输出
-
cin >> string
会跳过空白符读取连续非空白字符 -
getline(cin, string)
读取整行(包括空格) -
混合使用
cin
和getline
时要注意清除输入缓冲区
-
-
字符分类判断
-
isalpha(c)
:判断是否为字母(a-z/A-Z) -
isdigit(c)
:判断是否为数字(0-9) -
需要包含
<cctype>
头文件
-
-
哈希计数
-
使用
int count[128]
数组统计ASCII字符出现次数 -
通过字符的ASCII码直接访问数组元素
-
-
范围遍历
-
for (char c : str)
直接遍历字符串中的每个字符
-
参考题解
#include<iostream>
#include<cctype>
using namespace std;
int main() {
int count = 0;
cin >> count;
while(count --) {
string s;
cin >> s;
bool has_alpha = false, has_digit = false, has_special = false;
bool is_high = true; //先假设是高档,不符合时再降档
int count[128] = {0}; //用于统计ASCII字符出现次数
for (char c : s) {
//统计字符出现次数
if (++count[c] > 2) is_high = false;
//分类检查字符类型
if (isalpha(c)) {
has_alpha = true;
} else if (isdigit(c)) {
has_digit = true;
} else if (c == '*' || c == '#') {
has_special = true;
}
}
//判断安全等级
const bool full_condition = has_alpha && has_digit && has_special;
if (full_condition && is_high) {
cout << 2 << endl;
} else if (full_condition) {
cout << 1 << endl;
} else {
cout << 0 << endl;
}
}
return 0;
}
提示
目中输入格式中说“接下来 n 行,每行一个字符串,表示一个安全度至少为低的候选密码。”——所以可以不用判断是不是由这64种字符组成或者长度是否大于等于6,只要判断其他条件即可