Формализуем задачу, у нас дано две строки состоящих из 0 и 1 (0 — нет шоколада, 1 — есть), нужно найти количество позиций, в которых можно "приложить" вторую строку к первой. Вторую строку можно приложить начиная с данной позиции первой строки, если каждой единице из второй строки будет соответствовать 1 из первой строки.
В первой подзадаче требовалось просто написать то, что написано в условии.
Для того, чтобы решить вторую подзадачу, требовалось заметить, что для того, чтобы проверить возможность приложить вторую строку в данной позиции, нужно фактически сделать битовое "и", между ней, сдвинутой на нужное число позиций, и первой строкой и проверить, что число единиц в нем равно числу единиц во второй строке. Такие операции умеет делать структура данных "bitset", за O(n / w), где n — длина строки, а w — размер машинного слова. Итого решение работает за O(n * n / w), где w = 64 на большинстве современыых компьютеров.
Для того, чтобы получить полный балл по данной задаче, нужно было обратить внимание, что вторая строка имеет по условию специфический вид. Чтобы проверить, что ее можно приложить на позиции i, нужно проверить, что в первой строке на позициях i... i + a - 1, i + a + b... i + a + b + a - 1, ..., i + (m - 1)·(a + b), ..., i + (m - 1)·(a + b) + a - 1 находятся единицы. Но это означает, что надо проверить, что начиная с позиций i, ..., i + (m - 1)·(a + b) идет подряд хотя бы a единиц. Заведем массив, где в позиции хранится 1, если начиная с нее a позиций в первой строке содержат единицы и ноль иначе. Итого нам надо проверить что сумма чисел на позициях i, i + a + b, ..., i + (m - 1)·(a + b), равна m. поскольку расстояния между позициями, на которых мы берем сумму, равны, то если мы разобьем все позиции на классы, то в зависимости от остатка по модулю a + b, фактически надо будет брать сумму на отрезке, а это стандартная задача. Итоговая асимптотика O(n).