B3843 [GESP202306 三级] 密码合规
题目描述
网站注册需要有用户名和密码,编写程序以检查用户输入密码的有效性。合规的密码应满足以下要求 :。
-
只能由 a∼z\texttt a \sim \texttt za∼z 之间 262626 个小写字母、A∼Z\texttt A \sim \texttt ZA∼Z 之间 262626 个大写字母、0∼90 \sim 90∼9 之间 101010 个数字以及
!@#$四个特殊字符构成。 -
密码最短长度 :6:6:6 个字符,密码最大长度 :12:12:12 个字符。
-
大写字母,小写字母和数字必须至少有其中两种,以及至少有四个特殊字符中的一个。
输入格式
输入一行不含空格的字符串。约定长度不超过 100100100。该字符串被英文逗号分隔为多段,作为多组被检测密码。
输出格式
输出若干行,每行输出一组合规的密码。输出顺序以输入先后为序,即先输入则先输出。
输入输出样例 #1
输入 #1
seHJ12!@,sjdkffH$123,sdf!@&12HDHa!,123&^YUhg@!
输出 #1
seHJ12!@
sjdkffH$123
说明/提示
【样例 1 解释】
输入被英文逗号分为了四组被检测密码:seHJ12!@、sjdkffH$123、sdf!@&12HDHa!、123&^YUhg@!。其中 sdf!@&12HDHa! 长度超过 12 个字符,不合规;123&^YUhg@! 包含四个特殊字符之外的字符不合规。
题解
#include "bits/stdc++.h"
using namespace std;
const int N = 1e6+7;
int n, m;
string s, z;
bool check(string x){
int cnt1 = 0, cnt2 = 0, cnt3 = 0, cnt4 = 0;
if(x.size() < 6 || x.size() > 12) return false;
for(int i=0;i<x.size();++i){
if('a'<=x[i]&&x[i]<='z'){
cnt1++;
// continue;
}else if('A'<=x[i] && x[i]<='Z'){
cnt2++;
}else if('0'<=x[i] && x[i]<='9'){
cnt3++;
}else if(x[i]=='!' || x[i]=='@' || x[i]=='#' || x[i]=='$'){
cnt4++;
}else{
return false;
}
}
int cnt;
if(cnt4 == 0) return false;
if(cnt1 != 0) cnt++;
if(cnt2 != 0) cnt++;
if(cnt3 != 0) cnt++;
if(cnt < 2)return false;
return true;
}
int main(){
cin>>s;
int l = 0;
for(int i=0;i<s.size();++i){
if(s[i] == ','){
z = s.substr(l, i-l);
// cout<<z<<endl;
l = i+1;
if(check(z)) cout<<z<<endl;
}
}
z = s.substr(l, s.size()-l);
if(check(z)) cout<<z<<endl;
// cout<<z<<endl;
return 0;
}
1388

被折叠的 条评论
为什么被折叠?



