Всем доброго времени суток! Недавно решал III (XIV) открытый командный студенческий чемпионат Поволжья по спортивному программированию, И у меня возникло пару вопросов. Вот один из них: Как найти в массиве два элемента xor которых минимален? Заранее спасибо!
Не знаю можно ли проще:
Переберем один из элементов. Для текущего элемента будем поддерживать побитовый бор для всех предыдущих элементов. Теперь пройдемся по бору, каждый раз стараясь уменьшить текущий разряд в результирующем числе. Из всех вариантов выбрать минимум. O(NlogN)
UPD: На самом деле это означает, что если числа отсортировать, то для какого-то фиксированного выгодно взять его соседа. Вот решение проще ))
UPD2: Ну значит все-таки бор :)
В смысле "отсортировать?" просто по возрастанию? А для и наибольшего числа? Или имелось ввиду, что перебрав соседей для всех чисел, мы точно найдем оптимальный ответ?
Просто минимальность xor'a зависит и от состава этих чисел как двоичных строк, и от порядка символов, так что с бором, наверное, проще всего.
Да, я поспешил с сортировкой. Пока префиксы совпадают все верно, но если найдется отличие — там все плохо.
Хотя я сдал sort и у меня зашло. На за бор спасибо, теперь буду знать как и максимум искать, его ведь точно так же, да? спасибо)
Да, максимум можно бором.
Решение с сортировкой нужно более пристально изучить. Например на следующем тесте:
001 010 101
Ответ будет правильным, но для последнего числа оптимальной парой будет не сосед.
Авторское доказательство тут