当前位置: 首页 > article >正文

CCFCSP备考第二天

第35次认证第一题——密码

时间限制: 1.0 秒

空间限制: 512 MiB

相关文件: 题目目录(样例文件)

题目背景

西西艾弗网对用户密码有一套安全级别评定标准。

题目描述

在西西艾弗网上,用户的密码是一个由大写字母(A-Z)、小写字母(a-z)、数字(0-9)和特殊字符(* 和 #)共 64 种字符组成的字符串。

根据复杂程度不同,密码安全度被分为高、中、低三档。

  • 高:由上述 64 种字符组成,长度大于等于 6 个字符,包含字母、数字和特殊字符,同一个字符出现不超过 2 次;

  • 中:由上述 64 种字符组成,长度大于等于 6 个字符,包含字母、数字和特殊字符,且未达到高安全度要求;

  • 低:由上述 64 种字符组成,长度大于等于 6 个字符,且未达到中安全度要求;

小 P 为自己准备了 n 个候选密码,试编写程序帮小 P 自动判别每个密码的安全级别。保证这 n 个密码都至少满足低安全度要求,当安全度为高、中、低时分别输出 210 即可。

输入格式

从标准输入读入数据。

输入共 n+1 行。

第一行包含一个正整数 n,表示待判别的密码个数;

接下来 n 行,每行一个字符串,表示一个安全度至少为低的候选密码。

输出格式

输出到标准输出。

输出共 n 行,每行输出一个整数 21 或 0,表示对应密码的安全度。

样例输入

4
csp#ccsp
csp#ccsp2024
Csp#ccsp2024
CSP#2024

样例输出

0
1
2
2

样例解释

第一个密码不含数字,安全度为低;

第二个密码中小写字母 c 出现 3 次,安全度为中;

和第二个密码相比,第三个密码把一个小写字母 c 变为了大写,满足了高安全度要求;

第四个密码同样满足高安全度要求。

子任务

全部的测试数据满足 n≤100,且输入的每个字符串均不超过 20 个字符。

语言和编译选项

#名称编译器额外参数代码长度限制
0g++g++-O2 -DONLINE_JUDGE65536 B
1gccgcc-O2 -DONLINE_JUDGE65536 B
2javajavac65536 B
3python3python365536 B

相关知识点复习

关键知识点总结

  1. 字符串输入输出

    • cin >> string 会跳过空白符读取连续非空白字符

    • getline(cin, string) 读取整行(包括空格)

    • 混合使用 cin 和 getline 时要注意清除输入缓冲区

  2. 字符分类判断

    • isalpha(c):判断是否为字母(a-z/A-Z)

    • isdigit(c):判断是否为数字(0-9)

    • 需要包含 <cctype> 头文件

  3. 哈希计数

    • 使用int count[128]数组统计ASCII字符出现次数

    • 通过字符的ASCII码直接访问数组元素

  4. 范围遍历

    • for (char c : str) 直接遍历字符串中的每个字符

参考题解

#include<iostream>
#include<cctype>
using namespace std;

int main() {
	int count = 0;
	cin >> count;
	while(count --) {
		string s;
		cin >> s;
		
		bool has_alpha = false, has_digit = false, has_special = false;
		bool is_high = true; //先假设是高档,不符合时再降档
		int count[128] = {0}; //用于统计ASCII字符出现次数
		 
		for (char c : s) {
			//统计字符出现次数
			if (++count[c] > 2) is_high = false;
			
			//分类检查字符类型
			if (isalpha(c)) {
				has_alpha = true;
			} else if (isdigit(c)) {
				has_digit = true;
			} else if (c == '*' || c == '#') {
				has_special = true;
			}
		}
		
		//判断安全等级
		const bool full_condition = has_alpha && has_digit && has_special;
		if (full_condition && is_high) {
			cout << 2 << endl;
		} else if (full_condition) {
			cout << 1 << endl;
		} else {
			cout << 0 << endl;
		}
	}
	return 0;
} 

 

提示

目中输入格式中说“接下来 n 行,每行一个字符串,表示一个安全度至少为低的候选密码。”——所以可以不用判断是不是由这64种字符组成或者长度是否大于等于6,只要判断其他条件即可


http://www.kler.cn/a/541634.html

相关文章:

  • C++模拟实现AVL树
  • ffmpeg -codecs
  • Vue(4)
  • 996引擎-问题处理:三职业改单职业
  • Intellij IDEA如何查看当前文件的类
  • 储能系统-系统架构
  • 2.协同过滤算法
  • 第四期书生大模型实战营-第4关-L2G4000
  • 【RabbitMQ的监听器容器Simple和Direct】 实现和场景区别
  • 计算机视觉的研究方向、发展历程、发展前景介绍
  • Java网络编程学习(一)
  • 【leetcode 28】27.移除元素==双指针==
  • 【系统架构设计师】面向架构评估的质量属性
  • malloc底层原理 brk,sbrk,mmap
  • Spark 源码 | 脚本分析总结
  • 【Qt之·类QTextCursor】
  • 深入浅出:图解Vue 3生命周期的全流程
  • 红外皮秒激光器:开启超快激光技术新时代
  • 算法03-基数排序
  • 【AI知识点】苦涩的教训 The Bitter Lesson by Rich Sutton(2019)
  • Vite打包路径base配置项设置
  • JVM ①-类加载 || 内存区域
  • Redis 数据类型 List 列表
  • 【Python深入浅出】Python3正则表达式:开启高效字符串处理大门
  • 【AI学习】DeepSeek为什么强?
  • windows生成SSL的PFX格式证书