// https://stackoverflow.com/questions/78722724/find-unique-or-combination-for-given-array
import java.util.*;
class Solution {
void solve(List<Integer> nums, int index, int lastIndex, int taken, int curr, Set<Integer> values) {
if (taken > 0) {
values.add(curr);
}
if (index >= nums.size()) {
return;
}
// Take it.
if (lastIndex == -1 || nums.get(index) > nums.get(lastIndex)) {
int newOrValue = curr | nums.get(index);
if (!values.contains(newOrValue)) {
solve(nums, index + 1, index, taken + 1, newOrValue, values);
}
}
// Leave it
solve(nums, index + 1, lastIndex, taken, curr, values);
}
public List<Integer> getIncreasingSubsequenceOrValues(List<Integer> nums) {
Set<Integer> values = new HashSet<>();
solve(nums, 0 /* index */, -1 /* lastIndex */, 0 /* taken */, 0 /* curr */, values);
return new ArrayList<>(values);
}
}
public class Main {
static void print(List<Integer> v) {
for (int el : v) {
}
}
static void test(List<Integer> nums) {
System.
out.
print("Testing for array: "); print(nums);
Solution solution = new Solution();
List<Integer> result = solution.getIncreasingSubsequenceOrValues(nums);
print(result);
}
public static void main
(String[] args
) { test
(Arrays.
asList(4,
2,
4,
1)); test
(Arrays.
asList(3,
2,
4,
6)); }
}
Ly8gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvNzg3MjI3MjQvZmluZC11bmlxdWUtb3ItY29tYmluYXRpb24tZm9yLWdpdmVuLWFycmF5CgppbXBvcnQgamF2YS51dGlsLio7CgpjbGFzcyBTb2x1dGlvbiB7CiAgICB2b2lkIHNvbHZlKExpc3Q8SW50ZWdlcj4gbnVtcywgaW50IGluZGV4LCBpbnQgbGFzdEluZGV4LCBpbnQgdGFrZW4sIGludCBjdXJyLCBTZXQ8SW50ZWdlcj4gdmFsdWVzKSB7CiAgICAgICAgaWYgKHRha2VuID4gMCkgewogICAgICAgICAgICB2YWx1ZXMuYWRkKGN1cnIpOwogICAgICAgIH0KICAgICAgICBpZiAoaW5kZXggPj0gbnVtcy5zaXplKCkpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICAKICAgICAgICAvLyBUYWtlIGl0LgogICAgICAgIGlmIChsYXN0SW5kZXggPT0gLTEgfHwgbnVtcy5nZXQoaW5kZXgpID4gbnVtcy5nZXQobGFzdEluZGV4KSkgewogICAgICAgICAgICBpbnQgbmV3T3JWYWx1ZSA9IGN1cnIgfCBudW1zLmdldChpbmRleCk7CiAgICAgICAgICAgIGlmICghdmFsdWVzLmNvbnRhaW5zKG5ld09yVmFsdWUpKSB7CiAgICAgICAgICAgICAgICBzb2x2ZShudW1zLCBpbmRleCArIDEsIGluZGV4LCB0YWtlbiArIDEsIG5ld09yVmFsdWUsIHZhbHVlcyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLy8gTGVhdmUgaXQKICAgICAgICBzb2x2ZShudW1zLCBpbmRleCArIDEsIGxhc3RJbmRleCwgdGFrZW4sIGN1cnIsIHZhbHVlcyk7CiAgICB9CiAgICAKICAgIHB1YmxpYyBMaXN0PEludGVnZXI+IGdldEluY3JlYXNpbmdTdWJzZXF1ZW5jZU9yVmFsdWVzKExpc3Q8SW50ZWdlcj4gbnVtcykgewogICAgICAgIFNldDxJbnRlZ2VyPiB2YWx1ZXMgPSBuZXcgSGFzaFNldDw+KCk7CiAgICAgICAgc29sdmUobnVtcywgMCAvKiBpbmRleCAqLywgLTEgLyogbGFzdEluZGV4ICovLCAwIC8qIHRha2VuICovLCAwIC8qIGN1cnIgKi8sIHZhbHVlcyk7CiAgICAgICAgcmV0dXJuIG5ldyBBcnJheUxpc3Q8Pih2YWx1ZXMpOwogICAgfQp9CgpwdWJsaWMgY2xhc3MgTWFpbiB7CiAgICBzdGF0aWMgdm9pZCBwcmludChMaXN0PEludGVnZXI+IHYpIHsKICAgICAgICBmb3IgKGludCBlbCA6IHYpIHsKICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludChlbCArICIgIik7CiAgICAgICAgfQogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigpOwogICAgfQogICAgCiAgICBzdGF0aWMgdm9pZCB0ZXN0KExpc3Q8SW50ZWdlcj4gbnVtcykgewogICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIlRlc3RpbmcgZm9yIGFycmF5OiAiKTsKICAgICAgICBwcmludChudW1zKTsKICAgICAgICAKICAgICAgICBTb2x1dGlvbiBzb2x1dGlvbiA9IG5ldyBTb2x1dGlvbigpOwogICAgICAgIExpc3Q8SW50ZWdlcj4gcmVzdWx0ID0gc29sdXRpb24uZ2V0SW5jcmVhc2luZ1N1YnNlcXVlbmNlT3JWYWx1ZXMobnVtcyk7CiAgICAgICAgCiAgICAgICAgcHJpbnQocmVzdWx0KTsKICAgIH0KICAgIAogICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewogICAgICAgIHRlc3QoQXJyYXlzLmFzTGlzdCg0LCAyLCA0LCAxKSk7CiAgICAgICAgdGVzdChBcnJheXMuYXNMaXN0KDMsIDIsIDQsIDYpKTsKICAgIH0KfQo=