Блог пользователя Yury_Bandarchuk

Автор Yury_Bandarchuk, 11 лет назад, По-русски

Всем доброго времени суток! Недавно решал III (XIV) открытый командный студенческий чемпионат Поволжья по спортивному программированию, И у меня возникло пару вопросов. Вот один из них: Как найти в массиве два элемента xor которых минимален? Заранее спасибо!

  • Проголосовать: нравится
  • +5
  • Проголосовать: не нравится

»
11 лет назад, # |
Rev. 6   Проголосовать: нравится +8 Проголосовать: не нравится

Не знаю можно ли проще:

Переберем один из элементов. Для текущего элемента будем поддерживать побитовый бор для всех предыдущих элементов. Теперь пройдемся по бору, каждый раз стараясь уменьшить текущий разряд в результирующем числе. Из всех вариантов выбрать минимум. O(NlogN)

UPD: На самом деле это означает, что если числа отсортировать, то для какого-то фиксированного выгодно взять его соседа. Вот решение проще ))

UPD2: Ну значит все-таки бор :)

  • »
    »
    11 лет назад, # ^ |
    Rev. 3   Проголосовать: нравится 0 Проголосовать: не нравится

    В смысле "отсортировать?" просто по возрастанию? А для и наибольшего числа? Или имелось ввиду, что перебрав соседей для всех чисел, мы точно найдем оптимальный ответ?

    Просто минимальность xor'a зависит и от состава этих чисел как двоичных строк, и от порядка символов, так что с бором, наверное, проще всего.

    • »
      »
      »
      11 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится

      Да, я поспешил с сортировкой. Пока префиксы совпадают все верно, но если найдется отличие — там все плохо.

      • »
        »
        »
        »
        11 лет назад, # ^ |
        Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

        Хотя я сдал sort и у меня зашло. На за бор спасибо, теперь буду знать как и максимум искать, его ведь точно так же, да? спасибо)

        • »
          »
          »
          »
          »
          11 лет назад, # ^ |
            Проголосовать: нравится 0 Проголосовать: не нравится

          Да, максимум можно бором.

          Решение с сортировкой нужно более пристально изучить. Например на следующем тесте:

          001 010 101

          Ответ будет правильным, но для последнего числа оптимальной парой будет не сосед.