- 分别考虑每一位
- func表示一开始是0和一开始是1分别在第i轮后的结果是什么;f表示0和1分别与当前x做op操作的结果;now = func[now]表示它又做了一轮前i-1次的操作;然后ans[i] |= (now << k),将这一位的结果或到答案上,就是答案这一位的最终结果
- 发现只有连续的两个异或才可以抵消,其他的位运算都没有这种性质
#include <iostream>
#include <array>
#define endl '\n'
using namespace std;
const int N = 2e5 + 10;
int op1[N], op2[N];
int ans[N];
int main() {
ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
int n, c;
cin >> n >> c;
for (int i = 1; i <= n; ++ i) cin >> op1[i] >> op2[i];
for (int k = 0; k < 30; ++ k) {
array<int, 2> func = {0, 1};
int now = (c >> k & 1);
for (int i = 1; i <= n; ++ i) {
array<int, 2> f;
int x = (op2[i] >> k & 1);
if (op1[i] == 1) f = {0 & x, 1 & x};
if (op1[i] == 2) f = {0 | x, 1 | x};
if (op1[i] == 3) f = {0 ^ x, 1 ^ x};
func = {f[func[0]], f[func[1]]};
now = func[now];
ans[i] |= (now << k);
}
}
for (int i = 1; i <= n; ++ i)
cout << ans[i] << endl;
}