EduBrick
← вернуться к уроку · Продвинутый уровень: проверь себя

M. Пары с заданным «или»

3000 мс · 256 МБ · всё или ничего

Посчитайте количество пар индексов i<ji < j, для которых aiaj=ka_i \oplus a_j = k.

Ключевое свойство исключающего «или»: из ab=ka \oplus b = k следует b=akb = a \oplus k. То есть для каждого элемента напарник определён однозначно — это уже не перебор, а поиск.

Идём слева направо, храня счётчик встреченных значений:

long long answer = 0;
std::unordered_map<int, int> seen;
for (int x : a) {
    answer += seen[x ^ k];
    seen[x]++;
}

Каждая пара учитывается ровно один раз — в момент, когда встречается её правый элемент.

Отдельный случай — k=0k = 0: тогда напарник элемента равен ему самому, и формула считает количество пар одинаковых значений. Никакой особой обработки это не требует, но проверить на таком тесте стоит.

Ответ может не поместиться в 32 бита: при 10510^5 одинаковых чисел и k=0k = 0 пар почти 51095 \cdot 10^9.

Формат ввода

Первая строка содержит числа nn (1n1051 \le n \le 10^5) и kk (0k<2300 \le k < 2^{30}).

Вторая строка — nn чисел aia_i (0ai<2300 \le a_i < 2^{30}).

Формат вывода

Одно число.

Примеры

ввод
5 3
1 2 3 4 5
вывод
1
ввод
4 0
1 1 1 1
вывод
6
Войдите, чтобы отправлять решения.
← Вернуться к уроку