洛谷 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

 

posted @ 2026-03-13 06:42  Triwa  阅读(3)  评论(0)    收藏  举报