从高到低按位贪心,讨论一下初始0或1,分别暴力算出结果是什么
如果一开始0就能得1当然直接ans垒起来
如果1能得1而且当前m够用,那也垒起来,同时m减掉
否则gg
2min的代码
1 #include <bits/stdc++.h> 2 #define miaom(x,y) ((x & (1<<y))>>y) 3 using namespace std; 4 int n,m,p[200001],a[60],in[60]; 5 char opt[200001]; 6 char getch() 7 { 8 char ch; 9 for(ch=getchar();!isalpha(ch);ch=getchar()); 10 return ch; 11 } 12 int main() 13 { 14 scanf("%d%d",&n,&m); 15 for(int i=1;i<=n;i++) 16 { 17 opt[i]=getch(); 18 getch();if(opt[i]!='O')getch(); 19 scanf("%d",&p[i]); 20 } 21 int ans=0; 22 for(int i=30;i>=0;i--) 23 { 24 bool a=0,b=1; 25 for(int j=1;j<=n;j++) 26 if(opt[j]=='A') 27 a&=miaom(p[j],i), 28 b&=miaom(p[j],i); 29 else 30 if(opt[j]=='O') 31 a|=miaom(p[j],i), 32 b|=miaom(p[j],i); 33 else 34 if(opt[j]=='X') 35 a^=miaom(p[j],i), 36 b^=miaom(p[j],i); 37 if(a) ans+=1<<i; 38 else 39 if(b && m>=1<<i) m-=1<<i,ans+=1<<i; 40 } 41 printf("%d ",ans); 42 return 0; 43 }