杭电ACm密码有关问题-求指导提交的时侯前面的这个没有AC

杭电ACm密码问题--------求指导提交的时侯前面的这个没有AC
#include <iostream>

using namespace std;
int main()
{
    int n;

    string str;
    cin>>n;
    while (n--)
    {

        int j=0,k=0,l=0,m=0,sum=0;
        unsigned int i;
        cin>>str;
        if(str.length()>=8&&str.length()<=16)
        {
            for( i=0;i<str.length();i++)
            {
                if(str[i]>='0'&&str[i]<='9')
                j=1;
                else if(str[i]>='A'&&str[i]<='Z')
                k=1;
                else if(str[i]>='a'&&str[i]<='z')
                l=1;
                else if(str[i]=='~'||str[i]=='@'||str[i]=='$'||str[i]=='%'||str[i]=='^')
                m=1;
                else
                {
                    j=0;k=0;l=0;m=0;

                }
                sum=j+k+l+m;
            }
            if(sum>=3)
            cout<<"YES"<<endl;
            else
            cout<<"NO"<<endl;
        }
        else
        cout<<"NO"<<endl;
    }

    return 0;
}


#include<stdio.h>
#include<string.h>
int main()
{
 int M,i,t,a,b,c,d,sum;
 char s[60];
 while(scanf("%d",&M)!=EOF)
 {
  while(M--)
  {
   scanf("%s",s);
   t=strlen(s);
   if(t<8||t>16)
   {
    printf("NO\n");
    continue;
   }
   a=b=c=d=sum=0;
   for(i=0;s[i]!='\0';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]=='#'||s[i]=='$'||s[i]=='%'||s[i]=='^')d=1;
   }
   sum=a+b+c+d;
   if(sum>=3)
    printf("YES\n");
   else
    printf("NO\n");
  }
 }
 return 0;
}