Лексикографическая минимизация

Данная задача решается с помощью динамики по подмножествам.

Каждому индексу $$$i = 1, 2, \ldots, n$$$ поставим в соответствие подмножество $$$S_i \subseteq \left\{1, 2, \ldots, m\right\}$$$ такое, что объединение всех $$$S_i$$$ даёт множество $$$\left\{1, 2, \ldots, m\right\}$$$.

Тогда каждое такое подмножество $$$S_i$$$ можно представить в виде битовой маски $$$mask_i$$$, где $$$j$$$-й бит равен $$$1$$$, если $$$j \in S_i$$$, и $$$0$$$ иначе.

В самом начале для каждого $$$mask$$$ предпосчитаем $$$xorb_{mask} = b_{i_1} \oplus b_{i_2} \oplus \ldots \oplus b_{i_k}$$$, где на позициях $$$i_1, i_2, \ldots, i_k$$$ в $$$mask$$$ стоят единицы. Так мы сможем быстро отвечать за $$$\mathcal{O}\left(1\right)$$$ на запрос вычисления xor для подмножества $$$mask$$$.

Будем считать динамику $$$dp_{i, mask}$$$, в которой будем хранить $$$0/1$$$, параметры в $$$dp$$$ будут следующими:

$$$\bullet$$$ $$$mask$$$  — битовая маска, где $$$j$$$-й бит $$$1$$$, если $$$b_j$$$ был использован, и $$$0$$$ иначе.

$$$\bullet$$$ $$$i$$$  — длина рассмотренного префикса $$$a$$$.

$$$dp_{i, mask} = 1$$$, если можно набрать минимальный лексикографический массив $$$a_1, a_2, \ldots, a_i$$$ используя только $$$b_j$$$ из множества $$$mask$$$.

$$$dp_{i, mask} = 0$$$  — соответственно иначе. Пусть мы сейчас обновляем слой $$$i$$$ $$$\left(1 \leq i \leq n\right)$$$, разберем два случая:

$$$\bullet$$$ $$$1 \leq i < n$$$

Будем перебирать маску $$$mask$$$ из чисел, с которыми мы хотим проксорить $$$a_i$$$. Тогда $$$a_i$$$ станет равным $$$a_i \oplus xorb_{mask}$$$.

Так как наша цель — построить лексикографически минимальный массив длины $$$i$$$, то по индукции предполагаем, что префикс длины $$$i - 1$$$ уже является минимальным. Следовательно, для текущей маски $$$mask$$$ необходимо найти такую маску $$$prevmask$$$ из предыдущего слоя динамики, что: $$$prevmask \text{ } \& \text{ } mask = 0$$$ и $$$dp_{i - 1, prevmask} = 1$$$, если такая найдется, то сложим в массив $$$canupdate$$$ пару $$$\left(a_i \oplus xorb_{mask}, prevmask \mid mask\right)$$$. В массиве $$$canupdate$$$ мы будем хранить состояния $$$\left(i, mask\right)$$$, которые мы можем сделать равными $$$1$$$.

Так как $$$prevmask \ \&\ mask = 0$$$, то $$$prevmask$$$  — это просто подмаска дополнения маски $$$mask$$$, то есть подмаска маски $$$2^m - 1 - mask$$$. Перебор всех масок размера $$$n$$$ и их подмасок  — это известная задача с ассимптотикой работы $$$\mathcal{O}\left(3^n\right)$$$, почитать про неё можно здесь.

Рассмотрим массив достижимых состояний $$$canupdate$$$. Среди таких состояний мы можем сделать равными $$$1$$$ те и только те, у которых $$$a_i \oplus xorb_{mask}$$$ минимален, так как мы уже набрали минимальный лексикографически префикс длины $$$i - 1$$$ и чтобы лексикографическая минимальность сохранилась, к нему нужно добавить наименьшее число. Поэтому среди всех пар $$$\left(val, mask\right)$$$ из массива $$$canupdate$$$ мы сделаем $$$dp_{i, mask} = 1$$$ только для тех, для которых $$$val$$$ минимален. Тогда среди всех пар $$$\left(val, mask\right)$$$ нужно найти минимальный $$$val$$$, обозначим его за $$$minval$$$. После этого среди всех пар $$$\left(val, mask\right)$$$, у которых $$$minval$$$ равен $$$val$$$, сделаем $$$dp_{i, mask} = 1$$$.

$$$\bullet$$$ $$$i = n$$$

Этот случай отличается от предыдущего лишь тем, что в конце маска должна состоять из всех единиц, поэтому нужно рассматривать только состояния $$$\left(n, 2^m - 1\right)$$$.

Итоговая ассимптотика будет равняться $$$\mathcal{O}\left(3^m \cdot n\right)$$$.