← вернуться к уроку · Продвинутый уровень: проверь себя
M. Пары с заданным «или»
3000 мс · 256 МБ · всё или ничего
Посчитайте количество пар индексов , для которых .
Ключевое свойство исключающего «или»: из следует . То есть для каждого элемента напарник определён однозначно — это уже не перебор, а поиск.
Идём слева направо, храня счётчик встреченных значений:
long long answer = 0;
std::unordered_map<int, int> seen;
for (int x : a) {
answer += seen[x ^ k];
seen[x]++;
}
Каждая пара учитывается ровно один раз — в момент, когда встречается её правый элемент.
Отдельный случай — : тогда напарник элемента равен ему самому, и формула считает количество пар одинаковых значений. Никакой особой обработки это не требует, но проверить на таком тесте стоит.
Ответ может не поместиться в 32 бита: при одинаковых чисел и пар почти .
Формат ввода
Первая строка содержит числа () и ().
Вторая строка — чисел ().
Формат вывода
Одно число.
Примеры
ввод
5 3 1 2 3 4 5
вывод
1
ввод
4 0 1 1 1 1
вывод
6
Войдите, чтобы отправлять решения.