题目链接:http://codeforces.com/contest/876/problem/C
题意:给你n次二进制操作,要求用小于等于5的操作完全替代
思路:因为题目所有值都限制在0~1023,因为是二进制操作,我们考虑成二进制其实就是 000000000 111111111,由于初始值只可能是这个范围上的数,也就是说它的每一位要么是0 要么是1,所以我们只要分别考虑 0和1023作为初始值,然后运算一遍,最后对于每一位上的值,我们考虑什么操作能够得到这样的状态
有以下一种:0 1-> 0 0 (什么都不做)
0 1-> 0 1 ^0 &1
0 1->1 0 ^1
0 1->1 1 |1
AC代码(注意 | ^了的地方也要&1,因为这样才能保证当前位有效):
#include <bits/stdc++.h>
#include<queue>
#include<functional>
using namespace std;
const int MAXN = 1 << 12 + 5;
short map[MAXN];
int a = 0, b = 1023;
int main() {
int n;
scanf("%d", &n);
getchar();
for (int i = 0; i < n; i++) {
char c;
int value = 0;
scanf("%c %d", &c, &value);
if (c == '&') {
a &= value;
b &= value;
}
else if (c == '^') {
a ^= value;
b ^= value;
}
else {
a |= value;
b |= value;
}
getchar();
}
int AND = 0, OR = 0, XOR = 0, base = 1;
for (int i = 0; i <= 10; i++) {
int num1 = a & 1, num2 = b & 1;
if (num1) {
if (num2) {
AND += base;
OR += base;
XOR += 0;
}
else {
AND += base;
OR += 0;
XOR += base;
}
}
else {
if (num2) {
AND += base;
OR += 0;
XOR += 0;
}
else {
AND += 0;
OR += 0;
XOR += 0;
}
}
a >>= 1, b >>= 1, base <<= 1;
}
printf("3\n");
printf("& %d\n^ %d\n| %d\n", AND, XOR, OR);
return 0;
}