题解:贪心,从高位到低位考虑这一位到底是1还是0
O(nlogn)
#include<iostream> #include<cstdio> #include<cstring> using namespace std; const int maxn=100009; int n,m; int ans; int a[maxn]; int op[maxn]; int main(){ scanf("%d%d",&n,&m); for(int i=1;i<=n;++i){ char s[10]; scanf("%s",s); scanf("%d",&a[i]); if(s[0]=='A'){ op[i]=1; } if(s[0]=='O'){ op[i]=2; } if(s[0]=='X'){ op[i]=3; } } for(int j=30;j>=1;--j){ int b1=0,b2=1; for(int i=1;i<=n;++i){ if(op[i]==1){ if(a[i]&(1<<(j-1))){ b1&=1;b2&=1; }else{ b1&=0;b2&=0; } } if(op[i]==2){ if(a[i]&(1<<(j-1))){ b1|=1;b2|=1; }else{ b1|=0;b2|=0; } } if(op[i]==3){ if(a[i]&(1<<(j-1))){ b1^=1;b2^=1; }else{ b1^=0;b2^=0; } } } if(b1&&b2){ ans+=(1<<(j-1)); }else if(b1){ ans+=(1<<(j-1)); }else if(b2){ if(m>=(1<<(j-1))){ m-=(1<<(j-1)); ans+=(1<<(j-1)); }else{ } }else{ } } printf("%d ",ans); return 0; }