1 条题解

  • 0
    @ 2025-8-24 23:14:16

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar MingDynasty
    最后在线时间:2025.8.23 21:03|team/76415出题组|开局一个碗,结局一根绳|坐标你猜|小升初蒟蒻,欢迎吊打|5天内2小号互关(大号paste/lb3d6tr9),可提醒,不可炸铃接龙|题解不懂私|主页article/hu9a8skr

    搬运于2025-08-24 23:14:16,当前版本为作者最后更新于2025-04-22 15:43:04,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    题目链接

    一道毒瘤的判断题。本人调了一个小时。

    题目思路:

    注意:本题一次性读入一整行。

    我们发现,最毒瘤的地方就是判断密码是否合法,如果合法就判断属于哪种强度的密码,否则输出 0。

    我们在查看密码时,可以开一个数组,把每种字符只要出现过都标记成 1,最后看哪些字符被标记成了 1 就可以。对于特殊字符,我们可以使用 STL 中的 map 或 set,标记每个特殊字符出现的个数即可。

    本题细节较多,请各位仔细打代码,实在没有思路了再看我的代码。

    时间复杂度 O(Tnlogn)O(Tn \log n),可以通过本题,其中 nn 是字符串长度。

    Code:

    #include<bits/stdc++.h>
    using namespace std;
    string a;
    int n;
    inline bool check1(){
    	if(a.size()<12) return 0;
    	int s[44]={},cnt=0;
    	map<char,int> l;
    	for(int i=0;i<a.size();i++){
    		if(a[i]>='a'&&a[i]<='z') s[1]=1;
    		else if(a[i]=='~'||a[i]=='!'||a[i]=='@'||a[i]=='#'||a[i]=='$'||a[i]=='%'||a[i]=='^'||a[i]=='&'||a[i]=='*'||a[i]=='('||a[i]==')'||a[i]=='_') s[2]=1,l[a[i]]=1;
    		else if(a[i]>='A'&&a[i]<='Z') s[3]=1;
    		else if(a[i]>='0'&&a[i]<='9') s[4]=1;
    	}
    	int o=s[1]+s[2]+s[3]+s[4];
    	if(o==4) return 1;
    	if(o==3&&l.size()>=3) return 1;
    	return 0;
    }
    inline bool check2(){
    	if(a.size()<8) return 0;
    	int s[44]={},cnt=0;
    	map<char,int> l;
    	for(int i=0;i<a.size();i++){
    		if(a[i]>='a'&&a[i]<='z') s[1]=1;
    		else if(a[i]=='~'||a[i]=='!'||a[i]=='@'||a[i]=='#'||a[i]=='$'||a[i]=='%'||a[i]=='^'||a[i]=='&'||a[i]=='*'||a[i]=='('||a[i]==')'||a[i]=='_') s[2]=1,l[a[i]]=1;
    		else if(a[i]>='A'&&a[i]<='Z') s[3]=1;
    		else if(a[i]>='0'&&a[i]<='9') s[4]=1;
    	}
    	int o=s[1]+s[2]+s[3]+s[4];
    	if(o>=2) return 1;
    	return 0;
    }
    inline int ch(){
    	int s[44]={},cnt=0;
    	map<char,int> l;
    	for(int i=0;i<a.size();i++){
    		if(a[i]>='a'&&a[i]<='z') s[1]=1;
    		else if(a[i]=='~'||a[i]=='!'||a[i]=='@'||a[i]=='#'||a[i]=='$'||a[i]=='%'||a[i]=='^'||a[i]=='&'||a[i]=='*'||a[i]=='('||a[i]==')'||a[i]=='_') s[2]=1,l[a[i]]=1;
    		else if(a[i]>='A'&&a[i]<='Z') s[3]=1;
    		else if(a[i]>='0'&&a[i]<='9') s[4]=1;
    	}
    	int o=s[1]+s[2]+s[3]+s[4];
    	return o;
    }
    inline bool check3(){
    	if(a.size()<6) return 0;
    	return 1;
    }
    int main(){
    	cin.tie(0)->sync_with_stdio(0);
    	cin>>n;
    	getline(cin,a);
    	while(n--){
    		getline(cin,a);
    		bool k=0;
    		for(int i=0;i<a.size();i++){
    			if(!((a[i]>='0'&&a[i]<='9')||(a[i]>='A'&&a[i]<='Z')||(a[i]>='a'&&a[i]<='z')||(a[i]=='~'||a[i]=='!'||a[i]=='@'||a[i]=='#'||a[i]=='$'||a[i]=='%'||a[i]=='^'||a[i]=='&'||a[i]=='*'||a[i]=='('||a[i]==')'||a[i]=='_'))) {
    				k=1;
    				break;
    			}
    		}
    		if(k){cout<<"0\n";continue;}
    		if(check1()) cout<<3<<'\n';
    		else if(check2()) cout<<2<<'\n';
    		else if(check3()) cout<<1<<'\n';
    		else cout<<0<<'\n';
    	}
    	return 0;
    }
    

    祝各位通过!

    • 1

    信息

    ID
    12133
    时间
    3000ms
    内存
    512MiB
    难度
    2
    标签
    递交数
    0
    已通过
    0
    上传者