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

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

相关推荐
牛奶咖啡.8543 小时前
第十四届蓝桥杯大赛软件赛省赛C/C++ 大学 A 组真题
c语言·数据结构·c++·算法·蓝桥杯
旧时光林5 小时前
蓝桥杯 分解质因数(唯一分解定理)
数据结构·c++·算法·蓝桥杯·模拟·枚举
njsgcs5 小时前
ubuntu24.04 cmake 报错 libldap-2.5.so.0 解决办法
开发语言·c++
头发尚存的猿小二6 小时前
2024年第十五届蓝桥杯C&C++大学A组--成绩统计
c语言·开发语言·c++·蓝桥杯
JuicyActiveGilbert6 小时前
【C++游戏引擎开发】第9篇:数学计算库GLM(线性代数)、CGAL(几何计算)的安装与使用指南
c++·线性代数·游戏引擎
DevangLic6 小时前
下【STL 之速通pair vector list stack queue set map 】
开发语言·c++·list
rigidwill6667 小时前
LeetCode hot 100—子集
数据结构·c++·算法·leetcode·职场和发展
周不易7 小时前
ubuntu20.04+qt5.12.8安装serialbus
开发语言·c++·qt·modbus·serialbus
嘤国大力士7 小时前
C++11&QT复习 (十七)
开发语言·c++·qt