совместимые числа

Условие задачи

Условие

Дан массив длины . .

Два целых числа x и y называются совместимыми, если результат их побитового «И» равен нулю.

Выведите целых чисел . — любое такое число, что a_i & ans_i = 0, и при этом содержится в массиве , Иначе .

Решение

Решение

Что такое ? Значит для всех j-ых бит выполняется эти условия по определению :

  • , значит
  • , значит или

Пусть произвольное число. ~x инвертированное по битам x. Перепишем условия выше:

  • , значит
  • , значит или

Другими словами:

  • , значит любое
  • , значит

Пример:

...


Посчитаем динамику по маскам .

- зафиксируем позиции . Для условия . Следовательно на позициях можно поставить .

- значение или , можно ли собрать , где новая если некоторые в поменять на .

Ответ для значения , находится в , где .


const int M = 22;
int can[(1 << M) + 1];

void solve() {
  fill(begin(can), end(can), -1);
  int n;
  cin >> n;
  vector<int> a(n);
  for (int i = 0; i < n; i++) {
    cin >> a[i];
    can[a[i]] = a[i];
  }
  for (int j = 0; j < M; pos++) {
    for (int mask = 0; mask < (1 << M); mask++) {
      if (can[mask] != -1) {
        can[mask | (1 << j)] = can[mask];
      }
    }
  }
  int ones = (1 << M) - 1;
  for (int i = 0; i < n; i++) {
    cout << (can[ones - a[i]] != -1 ? can[ones - a[i]] : -1) << ' ';
  }
}

TODO чё за z? я видимо мискуликнул