Максимизировать сумму XOR

Ограничение по времени: 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.

Войдите, что бы отправлять решения