CCF-CSP第35次认证第一题 -- 《密码》

CCF-CSP第35次认证第一题 -- 《密码》

题目背景

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

题目描述

在西西艾弗网上,用户的密码是一个由大写字母(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 个字符。

题解:

#include <bits/stdc++.h>
using namespace std;

int main()
{
	int n;
	cin>>n;
	while(n--){
		string s;
		cin>>s;
		bool flag_count = true;//同一字符次数不超过2次
		bool flag_zimu = false, flag_shuzi = false, flag_zifu = false;//包含字母、数字和特殊字符
		int len = s.size(); //字符串长度
		map<char, int> M;
		for(int i=0;i<len;i++){
			M[s[i]]++; //统计字符出现次数
			if(M[s[i]] > 2) flag_count = false;
			if((s[i] <= 'Z' && s[i] >= 'A') || (s[i] <= 'z' && s[i] >= 'a')) flag_zimu = true;
			if(s[i] <= '9' && s[i] >= '0') flag_shuzi = true;
			if(s[i] == '*' || s[i] == '#') flag_zifu = true;
		}
		bool flag_total = false;
		if(flag_shuzi && flag_zifu && flag_zimu) flag_total = true;
		if(flag_total && flag_count && (len >= 6)) cout<<2<<endl;
		else if(flag_total && (!flag_count) && (len >= 6)) cout<<1<<endl;
		else if(len >= 6) cout<<0<<endl;
	}
	return 0;
}

 吐槽:

在考场的时候,就是因为审题没理解,不知道当时怎么了,一直没发现题目中的漏洞,然后样例过了,但是就是WA,一直搞了3个多小时,真是裂开了,现在重新写,10分钟一遍过。语文理解啊!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值