【NOI2014】起床困难综合症

Published on 2017 Jul 15 17:23:31
Last Updated on 2017 Jul 17 15:17:56

2W 1A
UOJ传送门
应该比较简单吧…由于运算都是二进制意义上的,所以从高到低考虑每个二进制位
因为如果结果的某一个高位为0,那么低位上再大也不会超过高位为1的结果
就可以CC啦
WA的两次居然是因为把opr数组开到char型…输出全都是负值…

#include <bits/stdc++.h>
using namespace std;
const int N=100005;
int n,m,opr[N];
char op[N][5];
int test(int x){
    for(int i=1;i<=n;i++){
        switch(op[i][0]){
            case 'A':
                x&=opr[i];
                break;
            case 'O':
                x|=opr[i];
                break;
            case 'X':
                x^=opr[i];
        }
    }
    return x;
}
int main(){
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++){
        scanf("%s%d",op[i],opr+i);
    }
    int ans=0,bst=test(0);
    for(int i=29;i>=0;i--){
        int d=(1<<i);
        if((ans|d)<=m){
            int nt=test(ans|d); 
            if(nt>bst) ans|=d,bst=nt;
        }
    }
    printf("%d",bst);
}
//短不?