HDU 2043 비밀번호 -- 물 문제 지만

http://acm.hdu.edu.cn/showproblem.php?pid=2043 비밀 번 호 는 물 문제 이지 만 비트 연산 길이 가 32 자리 이기 때문에 반대로 할 때 높 은 자리 가 1 로 바 뀌 어 나 를 오랫동안 조정 했다.
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <cctype>
#include <set>
using namespace std;
#define CLR(c,v) memset(c,v,sizeof(c))
#define PI 3.1415927
const double pi = acos(-1.0);
const double fo = 0.00000001;

template < typename _T>
_T Max(_T a,_T b){
    return (a>b)?(a):(b);
}
template < typename _T>
_T Abs(_T a){
    return (a>0)?(a):(-a);
}
template <typename _T>
_T gcd(_T a, _T b){
    if(b == 0) return a;
    return gcd(b, a % b);
}
struct _D{
    int x,y;
    _D(int x,int y):x(x),y(y){}
    _D(){}
    void input(){
        scanf("%d%d",&x,&y);
    }
    bool operator < (const _D& Val)const{
        if(y != Val.y)
            return y < Val.y;
        return x > Val.x;
    }
};


void swap(char &a,char &b){
     char tmp;
     tmp = a;
     a = b;
     b = tmp;
}

bool is_prime(int a){
    if(a <= 1)return false;
    if(a == 2)return true;
    int bound = sqrt(a*1.0);
    for(int i = 2; i <= bound ; i++){
        if(a % i == 0)return false;
    }
    return true;
}

int find(int goal,int num[],int l,int r){
    int mid = (l+r)/2;
    if(goal == num[mid])return mid;
    if(l >= r) return -1;
    if(goal < num[mid]) return find(goal,num,l,mid-1);
    if(goal > num[mid]) return find(goal,num,mid+1,r);
}

long long PowerRemainder(int a,int p,int n){ // quick calculate (a ^ p ) % n
	if (p == 1){return a % n;}
	if (p == 0){return 0;}
	long long r = PowerRemainder(a,p>>1,n);
	// r^5 = r^3 * r^2 % n = r^2*r * r^2 % n ; r^4 = r^2 * r^2 % n
	return (p & 1)?((r * (a%n)) % n * r % n):(r * r % n);
}

int divisor_sum(int num){
    int bound = sqrt(num*1.0);
    int sum = 1;
    for(int i = 2 ; i <= bound ; i++){
        if(num%i)continue;
        sum += i + ((num/i != i)?(num/i):(0)) ;
    }
    return sum;
}

bool is_sym(char c){
    char s[] = "~!@#$%^";
    for(int i = 0 ; s[i] != '\0' ; i++)
        if(c == s[i])  return true;
    return false;
}
bool is_upperalp(char c){
    return ('A' <= c) && (c <= 'Z');
}
bool is_loweralp(char c){
    return ('a' <= c) && (c <= 'z');
}
bool is_num(char c){
    return ('0' <= c) && (c <= '9');
}
int main()
{ 
    int Ncase;cin >> Ncase;
    while(Ncase--){
        char str[1000];unsigned int ok = 0;
        cin >> str;
        const int NUM = 1;
        const int SYM = 1<<1;
        const int ALP = 1<<2;
        const int Alp = 1<<3;
        int len = 0;
        for(int i = 0 ; str[i] != '\0' ; i++ ){
            if(is_num(str[i])){
                ok |= NUM;
            }else if(is_sym(str[i])){
                ok |= SYM;
            }else if(is_upperalp(str[i])){
                ok |= ALP;
            }else if(is_loweralp(str[i])){
                ok |= Alp;
            }
            len ++;
        }
        ok = ~ok;
        ok &= 15; //         32 ,           1
        if( (len>=8)&&(len <= 16) && (!ok || !(ok^NUM) || !(ok^SYM) || !(ok^ALP) || !(ok^Alp)) ){
            cout << "YES" << endl;
        }else{
            cout << "NO" << endl;
        }
    }
    return 0;
}

좋은 웹페이지 즐겨찾기