欢迎光临
我们一直在努力

洛谷 B3843:[GESP202306 三级] 密码合规 ← 字符串

【题目来源】 https://www.luogu.com.cn/problem/B3843 https://oj.czos.cn/p/3352 【题目描述】 网站注册需要有用户名和密码,编写程序以检查用户输入密码的有效性。合规的密码应满足以下要求 : 1. 只能由 a∼z 之间 26 个小写字母、A∼Z 之间 26 个大写字母、0∼9 之间 10 个数字以及 !@#$ 四个特殊字符构成。 2. 密码最短长度:6 个字符,密码最大长度:12 个字符。 3. 大写字母,小写字母和数字必须至少有其中两种,以及至少有四个特殊字符中的一个。 【输入格式】 输入一行不含空格的字符串。约定长度不超过 100。该字符串被英文逗号分隔为多段,作为多组被检测密码。 【输出格式】 输出若干行,每行输出一组合规的密码。输出顺序以输入先后为序,即先输入则先输出。 【输入样例】 seHJ12!@,sjdkffH$123,sdf!@&12HDHa!,123&^YUhg@! 【输出样例】 seHJ12!@ sjdkffH$123 【样例解释】 输入被英文逗号分为了四组被检测密码:seHJ12!@、sjdkffH$123、sdf!@&12HDHa!、123&^YUhg@!。其中 sdf!@&12HDHa! 长度超过 12 个字符,不合规;123&^YUhg@! 包含四个特殊字符之外的字符不合规。 【数据范围】 字符串长度不超过 100。 【算法分析】 ● 对于输入的每一组密码,分别进行以下检查: (1)长度检查:判断密码长度是否在 6 到 12 个字符之间。 (2)字符组成检查:遍历密码中的每个字符,判断是否属于合规字符集合。 (3)字符种类检查:统计大写字母、小写字母、数字和特殊字符的个数,判断“大写字母、小写字母、数字”是否至少满足两种,且至少一个特殊字符的条件。 ● 特别注意:循环结束后新增 if(!t.empty() && check(t)){…},确保末尾无逗号的子串也能被检查和输出。 【算法代码】

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

bool check(string s) {
int a=0,b=0,c=0,d=0,e=0;
for(int i=0; i<s.size(); i++) {
if(s[i]>='a'&&s[i]<='z') a=1;
else if(s[i]>='A'&&s[i]<='Z') b=1;
else if(s[i]>='0'&&s[i]<='9') c=1;
else if(s[i]=='!'||s[i]=='@'||s[i]=='#'||s[i]=='$') d=1;
else e=1;
}
if(s.size()<6 || s.size()>12) return false;
if(a+b+c<2 || d==0 || e==1) return false;
return true;
}

int main() {
string s,t;
cin>>s;
for(int i=0; i<s.size(); i++) {
if(s[i]!=',') t+=s[i];
else {
string str=t;
if(check(str)) cout<<str<<endl;
t="";
}
}

// Process the last substring that does not end with a comma
if(!t.empty() && check(t)) {
cout<<t<<endl;
}
return 0;
}

/*
in:
seHJ12!@,sjdkffH$123,sdf!@&12HDHa!,123&^YUhg@!

out:
seHJ12!@
sjdkffH$123
*/

【参考文献】 https://www.luogu.com.cn/problem/solution/B3843 https://blog.csdn.net/2403_87858277/article/details/144433453  

赞(0)
未经允许不得转载:171主机测评 » 洛谷 B3843:[GESP202306 三级] 密码合规 ← 字符串
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址