classSolution { public: // the meaning of suf[i][j][x]: for numbers up until i, can we form number x with j numbers // for nums[i](num): // if we don't pick it, then suf[i][j][x] |= suf[i + 1][j][x] // if we pick it, then suf[i][j][x | num] |= suf[i + 1][j - 1][x]; vector<vector<array<bool, 128>>> suf; vector<vector<array<bool, 128>>> pre;
intmaxValue(vector<int>& nums, int k){ int n = nums.size(); suf.resize(n + 1, vector<array<bool, 128>>(k + 1, array<bool, 128>{false})); pre.resize(n + 1, vector<array<bool, 128>>(k + 1, array<bool, 128>{false})); for (int i = 0; i < suf.size(); i++) { suf[i][0][0] = true; pre[i][0][0] = true; } for (int i = nums.size() - 1; i >= 0; i--) { int v = nums[i]; for (int j = 0; j <= k; j++) { for (int x = 0; x < 128; x++) { if (j) { suf[i][j][x | v] |= suf[i + 1][j - 1][x]; } suf[i][j][x] |= suf[i + 1][j][x]; } } } for (int i = 0; i < nums.size(); i++) { int v = nums[i]; for (int j = 0; j <= k; j++) { for (int x = 0; x < 128; x++) { if (j) { pre[i + 1][j][x | v] |= pre[i][j - 1][x]; } pre[i + 1][j][x] |= pre[i][j][x]; } } } int res = 0; for (int i = k; i <= nums.size() - k; i++) { for (int j = 0; j < 128; j++) { if (!pre[i][k][j]) { continue; } for (int l = 0; l < 128; l++) { if (!suf[i][k][l]) { continue; } res = max(res, j ^ l); } } } return res; } };