Олимпиадный тренинг

Задача . H2. Цикличный Хэмминг (сложная версия)


Это сложная версия задачи. Единственное различие между двумя версиями заключается в ограничениях на \(k\). Делать взломы можно только в том случае, если решены обе версии задачи.

В этой задаче все строки индексируются с \(0\).

Для двух строк \(a\), \(b\) одинаковой длины \(p\) определим следующие термины:

  • Расстояние Хэмминга между \(a\) и \(b\), обозначаемое как \(h(a, b)\), определяется как количество позиций \(i\) таких, что \(0 \le i < p\) и \(a_i \ne b_i\).
  • \(b\) является циклическим сдвигом \(a\), если существует некоторое число \(0 \leq k < p\) такое, что \(b_{(i+k) \bmod p} = a_i\) для всех \(0 \le i < p\). Здесь \(x \bmod y\) обозначает остаток от деления \(x\) на \(y\).

Даны две бинарные строки \(s\) и \(t\) длиной \(2^{k+1}\) каждая. Обе строки могут содержать пропущенные символы (обозначаются символом «?»). Ваша задача — подсчитать количество способов заменить отсутствующие символы в обеих строках на символы «0» или «1» таким образом, чтобы:

  • каждая строка \(s\) и \(t\) содержала ровно \(2^k\) вхождений каждого символа «0» и «1»;
  • \(h(s, c) \ge 2^k\) для всех строк \(c\), являющихся циклическим сдвигом \(t\).

Поскольку результат может быть очень большим, выведите его по модулю \(998\,244\,353\).

Входные данные

Первая строка содержит одно целое число \(k\) (\(1 \le k \le 12\)).

Вторая строка содержит строку \(s\) длины \(2^{k+1}\), состоящую из символов «0», «1» и «?».

Третья строка содержит строку \(t\) длины \(2^{k+1}\), состоящую из символов «0», «1» и «?».

Гарантируется, что обе строки \(s\) и \(t\) содержат не более \(2^k\) символов «0» или «1».

Выходные данные

Выведите одно целое число — ответ на задачу по модулю \(998\,244\,353\).

Примечание

В первом примере можно проверить, что для всех циклических сдвигов \(c\) из \(t\) выполняется условие \(h(s, c) \ge 2^k\). В частности:

  • Для \(c = \mathtt{0101}\), \(h(s, c) = h(\mathtt{0110}, \mathtt{0101}) = 2 \ge 2^1\).
  • Для \(c = \mathtt{1010}\), \(h(s, c) = h(\mathtt{0110}, \mathtt{1010}) = 2 \ge 2^1\).

Во втором примере существует циклический сдвиг \(c\) строки \(t\) такой, что \(h(s, c) < 2^k\) (в частности, \(c = \mathtt{0011}\), и \(h(s, c) = h(\mathtt{0011}, \mathtt{0011}) = 0\)).

В третьем примере существует \(2\) возможных способа восстановления недостающих символов:

  • \(s = \mathtt{0101}\), \(t = \mathtt{0110}\);
  • \(s = \mathtt{0011}\), \(t = \mathtt{0101}\).

В четвертом примере существует \(3\) возможных способа восстановления пропущенных символов:

  • \(s = \mathtt{00011110}\), \(t = \mathtt{01010101}\);
  • \(s = \mathtt{00011011}\), \(t = \mathtt{01010101}\);
  • \(s = \mathtt{00001111}\), \(t = \mathtt{01010101}\).

Примеры
Входные данныеВыходные данные
1 1
0011
0101
1
2 1
0011
0110
0
3 1
0??1
01??
2
4 2
000?????
01010101
3
5 2
0???????
1???????
68
6 5
0101010101010101010101010101010101010101010101010101010101010101
????????????????????????????????????????????????????????????????
935297567

time 2000 ms
memory 256 Mb
Правила оформления программ и список ошибок при автоматической проверке задач

Статистика успешных решений по компиляторам
 Кол-во
С++ Mingw-w643
Комментарий учителя