目录
一、题目
1、题目描述
2、输入输出
2.1输入
2.2输出
3、原题链接
二、解题报告
1、思路分析
2、复杂度
3、代码详解
一、题目
1、题目描述
2、输入输出
2.1输入
2.2输出
3、原题链接
878A - Short Program
二、解题报告
1、思路分析
顺序处理每个操作,每个操作按位处理
分别维护最终一定是1的位,一定是0的位,翻转的位
最终三个运算符对应的数分别输出即可
具体实现,我们可以初始化每个位为2,代表没有被操作
该位遇到&,就置0
遇到|,就 | 1
遇到^,就^ 1
最终的有效值为0,1,3,分别代表一定为0,为1,翻转
2、复杂度
时间复杂度: O(10n)空间复杂度:O(1)
3、代码详解
#include <bits/stdc++.h>
using i64 = long long;
using i32 = unsigned int;
using u64 = unsigned long long;
using i128 = __int128;
constexpr int inf32 = 1E9 + 7;
constexpr i64 inf64 = 1E18 + 7;
constexpr int P = 998'244'353;
void solve() {
int n;
std::cin >> n;
std::vector<int> a(10, 2);
for (int i = 0; i < n; ++ i) {
char op;
int x;
std::cin >> op >> x;
for (int b = 0; b < 10; ++ b) {
if (op == '&' && !(x >> b & 1)) {
a[b] = 0;
}
if(op == '|' && (x >> b & 1)) {
a[b] = 1;
}
if (op == '^' && (x >> b & 1)){
a[b] ^= 1;
}
}
}
std::vector<int> ans(3);
for (int i = 0; i < 10; ++ i)
if (a[i] == 0)
ans[0] |= 1 << i;
else if(a[i] == 1)
ans[1] |= 1 << i;
else if(a[i] == 3)
ans[2] |= 1 << i;
std::cout << "3\n";
std::cout << "& " << (1023 ^ ans[0]) << '\n';
std::cout << "| " << ans[1] << '\n';
std::cout << "^ " << ans[2] << '\n';
}
auto FIO = []{
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
std::cout.tie(nullptr);
return 0;
}();
int main () {
#ifdef DEBUG
freopen("in.txt", "r", stdin);
freopen("out.txt", "w", stdout);
#endif
int T = 1;
// std::cin >> T;s
while (T --)
solve();
return 0;
}