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

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

相关推荐
爱吃提升11 小时前
Dev-C++ 5.11 完整版快捷键大全(信奥/初学适用)
c语言·c++
SWAGGY..12 小时前
【C++进阶】:(10)哈希表的原理与实现——从哈希函数到哈希桶
c++·哈希算法·散列表
码匠许师傅12 小时前
【C++三方组件】redis-plus-plus:现代 Redis C++ 客户端
java·c++·redis
wuminyu12 小时前
stackChunkOop内部结构与GC屏障的配合工作原理剖析
java·linux·c语言·jvm·c++
小π军12 小时前
C 和 C++ 是否都支持函数的重载?
java·c语言·c++
烟花落o12 小时前
C++ 从 C 到进阶 ④:类和对象(下)—— 构造函数进阶、static、友元与内部类
c++·类和对象·初始化列表·匿名对象·内部类·友元函数·static成员函数
stellanke12 小时前
工业化C++:3. 继承、虚函数与运行时多态:从水果加工到日志策略设计
开发语言·c++
垆边人似月.12 小时前
华为题:最多可以参加的会议数目
数据结构·c++·算法
xiangyun6112 小时前
C++ list 模拟实现(一):手撕双向链表,从节点到迭代器
数据库·c++·算法·链表·stl·list
别动我齐刘海1 天前
C++ 工程化学习
java·linux·前端·c++·学习·机器学习·机器人