Ограничение по времени: 1.000 секунд
Ограничение по памяти: 500.000 мегабайт
Будем обозначать как ⊕ операцию побитового "исключающего или" для целых чисел. В языках программирования С++, C# и Java она обозначается символом ^
, в паскале и Python - ключевым словом xor
. Например, 9 ⊕ 3 = 10012 ⊕ 112 = 10102 = 10.
Даны два массива A и B длины n. Обозначим как X(A) для массива A результат вычисления побитового "исключающего или" от всех элементов массива: X(A) = A1 ⊕ A2 ⊕ ... ⊕ An. Аналогично, введем обозначение X(B) = B1 ⊕ B2 ⊕ ... ⊕ Bn.
Для каждого i от 1 до n разрешается поменять местами элементы Ai и Bi. Необходимо определить, какие из этих обменов надо сделать, чтобы максимизировать сумму X(A) + X(B).
В первой строке входных данных находится число n - количество элементов (1 ⩽ n ⩽ 105). В следующей строке находится n элементов массива A (0 ⩽ Ai ⩽ 1018). В следующей строке в таком же формате дан массив B.
В первой строке выведите максимальную возможную сумму и число k - количество необходимых обменов. В следующей строке выведите через пробел k различных чисел от 1 до n - индексы элементов, которые надо поменять.
input | output |
---|---|
2 1 1 2 2 |
6 1 1 |
В примере после обмена массивы равны A = [2,1] и B = [1,2], соответственно. X(A) = 2 ⊕ 1 = 102 ⊕ 12 = 112 = 3, X(B) = 3, X(A) + X(B) = 6.