パスワードHDU 2043


パスワード
Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 35961    Accepted Submission(s): 14385
Problem Description
ネット上には「よくネット上を漂っているのに、刀を打たれないわけにはいかないよ~」という言葉が流れている.実は安心してインターネットを利用できるようにするのは難しくないので、安全の知識を勉強すればいいです.
まず、安全なパスワードを設定します.では、どのようなパスワードが安全ですか?一般的に、より安全なパスワードは、少なくとも次の2つの条件を満たす必要があります.
(1).パスワードの長さが8以上で、16を超えないでください.
(2).パスワードの文字は、以下の「文字カテゴリ」の4つのグループの少なくとも3つのグループから来るべきである.
この4つの文字カテゴリは、次のとおりです.
1.大文字:A,B,C…Z;
2.小文字:a,b,c...z;
3.数字:0,1,2...9;
4.特殊符号:~,!,@,#,$,%,^;
パスワードをあげます.あなたの任務は安全なパスワードかどうかを判断することです.
 
Input
入力データの最初の行は1つの数Mを含んで、次はM行があって、1行ごとに1つのパスワード(長さは最大50かもしれません)で、パスワードは上の4種類の文字だけを含みます.
 
Output
各テスト例について、このパスワードが安全なパスワードであるか否かを判断し、そうであればYESを出力し、そうでなければNOを出力する.
 
Sample Input

   
   
   
   
3 a1b2c3d4 Linle@ACM ^~^@^@!%

 
Sample Output

   
   
   
   
NO YES NO

 
Author
linle
WA   N回は関数にelseが入っていないという状況だったのに、へえ、私の頭の中がバカだったんだ....
#include <iostream>
#include <cstring>

using namespace std;

bool judge(char *st,int len)
{
    int i,a1 = 0,a2 = 0,a3 = 0,a4 = 0;
    for(i = 0; i < len ; i++)
        if(st[i] >='a' && st[i] <= 'z')
        {
            a1 =1;
        }
        else if(st[i] >= '0' && st[i] <='9' )
        {
                a2 = 1;
        }
        else if(st[i] >= 'A' && st[i] <='Z' )
        {
                a3 = 1;
        }
        else if((st[i] == '~' || st[i] == '!' || st[i] == '@' ||st[i] == '#' || st[i] == '$' || st[i] == '%' || st[i] == '^'))
        {
                a4 = 1;
        }
        else return false;

    if(a1 + a2 + a3 + a4 >=3) return true;
    else return false;
}


int main()
{
    int M,i,j,len;
    char st[51] ="\0";

    cin >> M;
    while(M--)
    {
        cin >> st;
        len = strlen(st);

        if(len < 8 || len > 16) cout << "NO" << endl;
        else
        {
            if(judge(st,len)) cout << "YES"<<endl;
            else cout << "NO"<<endl;
        }
    }
    return 0;
}