Luogu2114 [NOI2014]起床困难综合症 【位运算】

题目分析:

按位处理即可

代码:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 
 4 const int maxn = 105000;
 5 
 6 int n,m;
 7 int a[maxn],b[maxn];
 8 
 9 void work(){
10     int z = 0;
11     for(int i=29;i>=0;i--){
12     if((1<<i)+z > m)continue;
13     int l = (1<<i),r=0;
14     for(int i=1;i<=n;i++){
15         if(a[i] == 0) l = (l&b[i]),r = (r&b[i]);
16         else if(a[i] == 1) l = (l|b[i]),r = (r|b[i]);
17         else l = (l^b[i]),r = (r^b[i]);
18     }
19     if((r&(1<<i)) != 0) continue;
20     if((l&(1<<i)) == 0) continue;
21     z += (1<<i);
22     }
23     for(int i=1;i<=n;i++){
24     if(a[i] == 0) z = (z&b[i]);
25     else if(a[i] == 1) z=  (z|b[i]);
26     else z = (z^b[i]);
27     }
28     printf("%d\n",z);
29 }
30 
31 int main(){
32     scanf("%d%d",&n,&m);
33     for(int i=1;i<=n;i++){
34     char ch = getchar();
35     while(ch > 'Z' || ch < 'A') ch = getchar();
36     if(ch == 'A'){a[i] = 0;}
37     else if(ch == 'O'){a[i] = 1;}
38     else a[i] = 2;
39     while(ch  != ' ') ch = getchar();
40     scanf("%d",&b[i]);
41     }
42     work();
43     return 0;
44 }

 

posted @ 2019-05-01 10:58  menhera  阅读(205)  评论(0编辑  收藏  举报