水题的题解也水......
原题链接:洛谷 P2114 [NOI2014]起床困难综合症
位运算每一位之间互不干扰。
经过所有门之后每一位不外乎四种结果:一定是0,一定是1,不变或取反。
按位枚举,贪心即可。
对于不变的,我们在限制之内尽可能选更多的1。
其余三种都选0。
代码略显繁杂。
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 6 int n,m; 7 int op[100005]; 8 int b[100005]; 9 int res[35]; 10 int fin[35]; 11 int ans; 12 13 int main() 14 { 15 scanf("%d%d",&n,&m); 16 char tp[10]; 17 for(int i=1;i<=n;i++) 18 { 19 scanf("%s",tp+1); 20 scanf("%d",&b[i]); 21 if(tp[1]=='A')op[i]=1; 22 if(tp[1]=='O')op[i]=2; 23 if(tp[1]=='X')op[i]=3; 24 } 25 for(int i=0;i<=30;i++) 26 { 27 for(int j=n;j;j--) 28 { 29 int nw=((b[j]>>i)&1); 30 if(op[j]==1) 31 { 32 if(nw==0){res[i]+=2;break;} 33 if(nw==1)continue; 34 } 35 if(op[j]==2) 36 { 37 if(nw==0)continue; 38 if(nw==1){res[i]=res[i]?2:3;break;} 39 } 40 if(op[j]==3) 41 { 42 if(nw==0)continue; 43 if(nw==1)res[i]=(res[i]^1); 44 } 45 } 46 } 47 int fl=0; 48 for(int i=30;i>=0;i--) 49 { 50 int gl=((m>>i)&1); 51 int nw=(res[i]==0); 52 if(fl)fin[i]=nw; 53 if(gl==1&&nw==1)fin[i]=1; 54 if(gl==1&&nw==0)fl=1; 55 } 56 for(int i=0;i<=30;i++) 57 { 58 if(fin[i])ans=ans|(1<<i); 59 if(res[i]%2)ans=ans|(1<<i); 60 } 61 printf("%d",ans); 62 return 0; 63 }