Ctrl K

Книги между подпорками

Средняя
Полка в библиотеке описана строкой shelf: символ '*' — книга, символ '|' — книжная подпорка. Позиции нумеруются с нуля. В списке ranges лежат запросы [left, right]. Каждый запрос рассматривает только участок полки с left по right включительно и спрашивает: сколько книг этого участка надёжно зажато, то есть имеют внутри участка хотя бы одну подпорку слева и хотя бы одну справа? Подпорки за границами участка не учитываются. Верните список ответов в порядке запросов. Запросов может быть очень много, поэтому пересчитывать каждый участок заново будет слишком медленно.
Пример 1
shelf="|**|*|**", ranges=[[0, 5], [1, 7], [4, 7]] → [3, 1, 0]

На отрезке |**|*| все три книги стоят между подпорками. На отрезке **|*|** подпорки стоят на позициях 3 и 5, между ними одна книга. На отрезке *|** подпорка одна, поэтому ответ 0.

Пример 2
shelf="*|***|*", ranges=[[0, 6], [2, 4]] → [3, 0]

Во всей полке три книги зажаты между подпорками 1 и 5, а книги по краям не в счёт. В отрезке *** подпорок нет вовсе.

Ограничения
  • 3 ≤ len(shelf) ≤ 3·10⁵
  • shelf состоит только из символов '*' и '|'
  • 1 ≤ len(ranges) ≤ 10⁵
  • ranges[i] = [left, right], 0 ≤ left ≤ right < len(shelf)
Встречал эту задачу на настоящем собесе?
Решили0
Пробовали0
Отправок0
Принято—
Темы
Похожие задачиМало нулей или мало единиц: запросы на отрезках СложнаяСамый короткий рывок СредняяОтрезки с маленьким произведением СредняяСлова, спрятанные в тексте СредняяПрокрутка букв по префиксам Средняя
загружаем Python…
Вход
shelf="|**|*|**", ranges=[[0, 5], [1, 7], [4, 7]]
Ожидается
[3, 1, 0]

«Запустить» — первые 3 теста у тебя в браузере, «Отправить» — все 15 тестов на сервере, включая скрытые.