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

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

相关推荐
C++ 老炮儿的技术栈1 天前
从 Qt Designer 属性编辑器的层级可以看到继承链
c语言·数据库·c++·qt·sqlite·visual studio
new_zhou1 天前
C++ 项目 AI 协作指南(Windows / MSVC 环境)
c++·人工智能·windows
水饺编程1 天前
AT&T 汇编语言学习笔记开篇语
c语言·汇编·c++
Iruoyaoxh1 天前
类和对象~
开发语言·c++
程序喵大人1 天前
【C++进阶】STL算法与函数对象 - 04 find、count和any_of把查询写成意图
开发语言·c++·算法
豆沙沙包?1 天前
c++中引用(P7-P11)
java·c++·算法
wuminyu1 天前
虚拟线程底层ForkJoinPool的工作窃取算法机制
java·linux·c语言·jvm·c++
吹什么轩1 天前
c++复习:c++11:lambda表达式
开发语言·c++
不会代码的小猴1 天前
标准模板库(STL)
开发语言·c++·笔记·算法
旖旎夜光1 天前
LeetCode 202:快乐数(双指针问题) —— 题解
数据结构·c++·算法·leetcode·双指针