题意:有一些位运算操作,找出一个小于m的整数使其经过这些操作后得到的数最大.
对于这个整数的每一位之间运算互不影响,所以我们从高位到地位贪心填二进制数,使其这一位能得到1
#include<cstdio> using namespace std; const int N=1e5+5; int n,m; int op[N],w[N]; char s[233]; int calc(int x) { for(int i=1;i<=n;i++) { if(op[i]==1) x&=w[i]; if(op[i]==2) x|=w[i]; if(op[i]==3) x^=w[i]; } return x; } int main() { scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) { scanf("%s",s); if(s[0]==‘A‘) op[i]=1; else if(s[0]==‘O‘) op[i]=2; else op[i]=3; scanf("%d",&w[i]); } int u=1,qaq=calc(0); for(;u<=m;u<<=1); u>>=1; int ans=0; for(;u;u>>=1) { if(qaq&u) continue; if(ans+u>m) continue; if(u&calc(u))ans+=u; } printf("%d\n",calc(ans)); return 0; }
原文地址:https://www.cnblogs.com/pigba/p/8981981.html
时间: 2024-10-19 11:06:09