AlenaNuna

导航

HJ20 密码验证合格程序

题目:https://www.nowcoder.com/practice/184edec193864f0985ad2684fbc86841?tpId=37&tqId=21243&rp=1&ru=/exam/oj/ta&qru=/exam/oj/ta&sourceUrl=%2Fexam%2Foj%2Fta%3FtpId%3D37&difficulty=undefined&judgeStatus=undefined&tags=&title=

前两个判断很简单,就不多说了

第三个的判断可以用strstr。strstr(s1,s2)返回的是s2第一次在s1中出现的地址,如果不存在则返回NULL。

strstr(s1+from+1,s2)则是不包括当前起始位置。

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 char s[110],s1[110];
 4 int l,cnt;
 5 bool f[5];
 6 bool Work(){
 7     for(int from=0;from+2<l;from++)
 8         for(int to=from+2;to<l;to++){
 9             int len=0;
10             for(int k=from;k<=to;k++)
11                 s1[len++]=s[k];
12             s1[len]='\0';
13             if(strstr(s+from+1,s1)!=NULL)return 0;
14         }
15     return 1;
16 }
17 bool Check(){
18     l=strlen(s);
19     if(l<=8)return 0;
20     cnt=0;
21     memset(f,0,sizeof(f));
22     for(int i=0;i<l;i++){
23         if(s[i]>='A'&&s[i]<='Z'){
24             if(!f[0]){
25                 f[0]=1;
26                 cnt++;
27             }
28         }
29         else if(s[i]>='a'&&s[i]<='z'){
30             if(!f[1]){
31                 f[1]=1;
32                 cnt++;
33             }
34         }
35         else if(s[i]>='0'&&s[i]<='9'){
36             if(!f[2]){
37                 f[2]=1;
38                 cnt++;
39             }
40         }
41         else {
42             if(!f[3]){
43                 f[3]=1;
44                 cnt++;
45             }
46         }
47     }
48     if(cnt<3)return 0;
49     if(Work()) return 1;
50     else return 0;
51 }
52 int main(){
53     while(~scanf("%s",s)){
54         if (Check()) puts("OK");
55         else puts("NG");
56     }
57     return 0;
58 }

 

posted on 2024-09-07 00:47  AlenaNuna  阅读(9)  评论(0编辑  收藏  举报