Разрабатывая мой предыдущий answer:
Input: массив размера п, что 1 <= a[i] <= m
Выход: Количество подмножеств так, что исключающий из множества остальных чисел равно нуль. Обратите внимание на то, что это эквивалентно числу подмножеств, xor = X where X = xor of all elements of a
Рассмотрим ваш пример,
X = XOR({1,1,3,4,5}) = 2
Убедитесь, что XOR({1,3})=2
и XOR({3,4,5})=2
где XOR(set)== XOR of all elements of set
Решение:
Рассмотрите Dynamic Programming таблица размеров n * m.
D[i][j] = #subsets considering first i elements of a whose xor is j
Теперь для расчета таблицы, вам необходимо определить следующее рекуррентное соотношение:
D[i][j] = D[i-1][j] + D[i-1][j xor a[i]]
.
Интуиция/Proof:
Вы должны вычислить число подмножеств первых г элементов, исключающее является J. Фокус на Ith элемента а [I],
а [я] нет в подмножестве => любое подмножество i-1
элементов, исключающее это J будут действительны
а [I] присутствует в подмножестве => любое подмножество i-1
элементов, чей xor равно j xor a[i]
. Это связано с тем, что когда мы добавляем к этому множеству [i], имеем j xor a[i] xor a[i] = j
. Таким образом, xor нового набора j.
И, наконец, вы заполнили всю таблицу. Ваш ответ D[n][X]
, поскольку вам нужны те подмножества, xor которых X.
PS: Если вы все еще смущены, я предлагаю вам пройти технику динамического программирования. Попробуйте на своем примере, вы можете понять это лучше.
Вы должны разместить это как комментарий к принятому ответу. – joews
Не могли бы вы? Необходимы повторные точки, которые новые пользователи не имеют при запуске. – user810
также может быть связан с [algorithm - Увеличить набор чисел, чтобы сумма XOR была равна 0 - Переполнение стека] (https://stackoverflow.com/questions/14199255/increase-set-of-numbers-so-that-xor- сумма-это-0? RQ = 1) – Wolf