题解分享
题解分享简介
位运算 - 题解
```cpp
#include <iostream>
#include <cstdio>
#include <vector>
#include <cmath>
#include <algorithm>
#include <cstring>
#define int long long
#define rep(i, l, r) for (int i = (l); i <= (r); i ++ )
#define per(i, r, l) for (int i = (r); i >= (l); i -- )
using namespace std;
const int N = 1e5 + 5, M = (1 << 8);
const long long INF = 1e18;
long long value[M][M];
int n, a[N];
void fill_value() {
for (int x = 0; x < M; x ++ )
for (int y = 0; y < M; y ++ )
value[x][y] = -INF;
}
signed main() {
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
cin >> n;
int t = 0;
rep(i, 1, n) cin >> a[i];
reverse(a + 1, a + 1 + n);
fill_value();
long long ans = 0;
rep(i, 1, n) {
int x = (a[i] >> 8), y = (a[i] & (M - 1));
long long v = 0;
for (int z = 0; z < M; z ++ )
v = max(v, value[x][z] + (y & z));
for (int z = 0; z < M; z ++ )
value[z][y] = max(value[z][y], v + ((x & z) << 8));
ans = max(ans, a[i] + v);
}
cout << ans << ' ';
fill_value();
ans = 0;
rep(i, 1, n) {
int x = (a[i] >> 8), y = (a[i] & (M - 1));
long long v = 0, lst;
for (int z = 0; z < M; z ++ )
v = max(v, value[x][z] + (y | z));
for (int z = 0; z < M; z ++ )
value[z][y] = max(value[z][y], v + ((x | z) << 8));
ans = max(ans, a[i] + v);
}
cout << ans << ' ';
fill_value();
ans = 0;
rep(i, 1, n) {
int x = (a[i] >> 8), y = (a[i] & (M - 1));
long long v = 0, lst;
for (int z = 0; z < M; z ++ )
v = max(v, value[x][z] + (y ^ z));
for (int z = 0; z < M; z ++ )
value[z][y] = max(value[z][y], v + ((x ^ z) << 8));
ans = max(ans, a[i] + v);
}
cout << ans << ' ';
return 0;
}
```
查看全文
0
0
0
4



