题目大意:
输入给出一串位运算,输出一个步数小于等于5的方案,正确即可,不唯一。
题目分析:
英文题的理解真的是各种误差,从头到尾都以为解是唯一的。
根据位运算的性质可以知道:
一连串的位运算最终都可以用三个位运算代替(&|^)。
那么仅需对每一位的情况进行讨论,某一位:
- 必须变为1 (|1)
- 必须变为0 (&0)
- 必须01颠倒(^1)
最后输出3种位运算即可(输出三种最稳妥)。
code
#include<bits/stdc++.h>
using namespace std;
int x, y, n;
int main(){
//freopen("h.in", "r", stdin);
scanf("%d", &n);
x = 0, y = (1<<10)-1;
for(int i = 1; i <= n; i++){
char opt[5];
int v;
scanf("%s %d", opt + 1, &v);
if(opt[1] == '|'){
x |= v;
y |= v;
}
else if(opt[1] == '&'){
x &= v;
y &= v;
}
else if(opt[1] == '^'){
x ^= v;
y ^= v;
}
}
int orr, andd, xorr;
orr = andd = xorr = 0;
for(int i = 0; i < 10; i++){
int t = 1 << i;
if(x & t){
if(y & t) orr |= t;
else xorr |= t;
andd |= t;
}
else{
if(y & t)
andd |= t;
}
}
printf("3
");
printf("& %d
", andd);
printf("| %d
", orr);
printf("^ %d
", xorr);
return 0;
}