Для простоты предположим, что в массиве нет дубликатов. Чтобы XOR между 2 числами был> = 4, они должны иметь любой другой бит (исключая младшие 2 бита). Учитывая, что мы уже знаем, что они являются четно-четными или нечетно-нечетными парами, их младший бит одинаков.
Обратите внимание, что для любого числа X X XOR (X + 4 + k) всегда будет> = 4. Таким образом, проблема заключается в рассмотрении того, что происходит с X XOR (X + 1), X XOR (X + 2) и X XOR (X + 3).
X XOR (X + 1) будет> = 4, когда третий младший бит изменился, добавив только 1. Это означает, что у нас было X, заканчивающееся на 011, поэтому X + 1 заканчивается на 100, или у нас было X, заканчивающееся на 111, так что X + 1 заканчивается на 000. В обоих случаях это означает X% 4 = 3. В любом другом случае (X% 4! = 3) X XOR (X + 1) будет <4. </p>
Чтобы X XOR (X + 2) было> = 4, третий младший бит изменился путем добавления 2. Это означает, что X закончился в 011, 010, 111 или 110. Таким образом, теперь у нас есть X% 4 = 3 или X% 4 = 2.
Чтобы X Xor (X + 3) было> = 4, третий младший бит изменился путем добавления 3. Это означает, что X закончился в 011, 010, 001, 111, 110, 101. Итак, теперь у нас есть X % 4 = 3, X% 4 = 2 или X% 4 = 1.
Вот псевдокод:
for each element in array:
count[element] += 1
total += 1
for each X in sorted keys of count:
if X % 4 == 3:
answer += count[X + 1] + count[X + 2] + count[X + 3]
if X % 4 == 2:
answer += count[X + 2] + count[X + 3]
if X % 4 == 1:
answer += count[X + 3]
total -= count[X]
answer += total - (count[X + 1] + count[X + 2] + count[X + 3]) # all X + 4 + K work
Чтобы учесть дубликаты, нам нужно избегать подсчета числа против самого себя. Вам нужно будет вести подсчет каждого числа и делать то же, что и выше, с модификацией, что ответом будет подсчет этого числа * (все остальные - количество чисел X + 2)