CCF CSP 第35次(2024.09)(1_密码_C++)(哈希表)

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

欢迎大家和我沟通交流(✿◠‿◠)

相关推荐
深耕AI3 小时前
【MFC中OnInitDialog虚函数详解:哪个是虚函数?两个OnInitDialog的关系】
c++·mfc
CHANG_THE_WORLD3 小时前
并发编程指南 同步操作与强制排序
开发语言·c++·算法
pl00203 小时前
C++虚函数&虚析构函数&纯虚函数的使用说明和理解
c++·虚函数·纯虚函数·虚析构函数
小wanga6 小时前
C++知识
java·开发语言·c++
深思慎考6 小时前
LinuxC++项目开发日志——高并发内存池(1-定长内存池)
linux·c++
木心爱编程6 小时前
C++容器内存布局与性能优化指南
开发语言·c++·性能优化
咔咔咔的6 小时前
3446. 按对角线进行矩阵排序
c++
芒果敲代码7 小时前
什么是交叉编译?
c++
Qiang_san7 小时前
C++11新特性 | 欢迎来到现代C++的世界!
开发语言·c++
要做朋鱼燕8 小时前
【C++】迭代器详解与失效机制
开发语言·c++·算法