CCF CSP 第35次(2024.09)(1_密码_C++)
时间限制 : 1.0 秒
空间限制 : 512 MiB
原题链接
解题思路:
思路一(哈希表):
1、解题步骤拆分:
① 数据输入:
- 第一行输入整数 n (n代表待判别的密码个数)
- 接下来n行输入n个判别密码(string)
② 数据处理:
- 从题目中可知安全级别评定对应输出的整数: 高:2;中:1;低:0
- 题目说 n 个密码都至少满足低安全度要求,低要求的条件最少,中要求次之,高要求条件最多。所以我们可以从高要求独特的条件中筛选出高安全要求,再从中要求独特的条件中筛选出中安全要求,剩余的则为低要求。
- 高要求的独特条件:同一个字符不超过2次(通过哈希表统计字符出现次数)。
- 中要求相对于低要求的独特条件:包含字母、数字和特殊字符(使用哈希表记录这三种字符出现的次数)。
③ 数据输出:输出密码所属类型。
代码实现
代码实现(思路一(哈希表)):
cpp
#include<iostream>
#include<vector>
#include<unordered_map>
#include<string>
using namespace std;
// 中和低的区分
// 判断字符串中是否包含字母、数字和特殊字符,若包含三种则返回true,否则返回false
bool a_1_specialChar_type(string &str){
unordered_map<string,int> mp; // 使用哈希表记录字符类型的出现次数
mp["c_a"] = 0; // 记录字母的数量
mp["c_1"] = 0; // 记录数字的数量
mp["c_special"] = 0; // 记录特殊字符的数量
for (char &c : str){
if (c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z'){ // 判断是否为字母
mp["c_a"]++;
}
if (c >= '0' && c <= '9'){ // 判断是否为数字
mp["c_1"]++;
}
if (c == '*' || c == '#'){ // 判断是否为特殊字符(可以扩展其他特殊字符)
mp["c_special"]++;
}
}
// 如果字母、数字和特殊字符都出现过,返回true
if (mp["c_a"] != 0 && mp["c_1"] != 0 && mp["c_special"] != 0){
return true;
}
return false; // 否则返回false
}
// 高要求的独特条件为:同一个字符不超过2次(通过哈希表来统计字符出现次数)
// 判断同一个字符出现次数是否超过2,不超过2则返回true,超过则返回false
bool isCharCountValid(string &str){
unordered_map<char,int> mp; // 用哈希表存储字符及其出现次数
for (char &c : str){
mp[c]++; // 记录字符出现次数
// 如果字符出现次数超过2次,返回false
if (mp.count(c) && mp[c] > 2){
return false;
}
}
return true; // 如果所有字符都满足不超过2次,返回true
}
int main(int argc, char const *argv[])
{
int n; // 存储待判别的密码个数
cin >> n;
string str;
vector<int> ans; // 存储每个密码的安全等级
for (int i = 0; i < n; i++){
cin >> str; // 输入密码
// 判断密码的安全等级
if (isCharCountValid(str)){
ans.push_back(2); // 如果满足高要求,则安全度为2
} else if (a_1_specialChar_type(str)){
ans.push_back(1); // 如果满足中要求,则安全度为1
} else {
ans.push_back(0); // 否则,安全度为0
}
}
// 输出每个密码的安全等级
for (int &i : ans){
cout << i << endl;
}
return 0;
}
欢迎大家和我沟通交流(✿◠‿◠)