{"id":31754727,"url":"https://github.com/fuodorov/yaalgorithms","last_synced_at":"2025-10-09T18:23:14.447Z","repository":{"id":49383382,"uuid":"451877760","full_name":"fuodorov/yaalgorithms","owner":"fuodorov","description":"Solving problems in Algorithms courses","archived":false,"fork":false,"pushed_at":"2023-03-05T14:43:34.000Z","size":193,"stargazers_count":45,"open_issues_count":0,"forks_count":36,"subscribers_count":5,"default_branch":"main","last_synced_at":"2023-05-12T17:29:07.253Z","etag":null,"topics":["algorithms","data-structures","dynamic-programming","golang","graph-algorithms","greedy-algorithms","hash-functions","python","recursive-algorithms","sorting-algorithms","tree-structure"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/fuodorov.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2022-01-25T12:57:20.000Z","updated_at":"2023-05-10T14:47:54.000Z","dependencies_parsed_at":"2023-01-22T23:45:26.176Z","dependency_job_id":null,"html_url":"https://github.com/fuodorov/yaalgorithms","commit_stats":null,"previous_names":[],"tags_count":null,"template":null,"template_full_name":null,"purl":"pkg:github/fuodorov/yaalgorithms","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fuodorov%2Fyaalgorithms","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fuodorov%2Fyaalgorithms/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fuodorov%2Fyaalgorithms/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fuodorov%2Fyaalgorithms/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/fuodorov","download_url":"https://codeload.github.com/fuodorov/yaalgorithms/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fuodorov%2Fyaalgorithms/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":279001941,"owners_count":26083226,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-09T02:00:07.460Z","response_time":59,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["algorithms","data-structures","dynamic-programming","golang","graph-algorithms","greedy-algorithms","hash-functions","python","recursive-algorithms","sorting-algorithms","tree-structure"],"created_at":"2025-10-09T18:22:50.702Z","updated_at":"2025-10-09T18:23:14.433Z","avatar_url":"https://github.com/fuodorov.png","language":"Python","readme":"# Базовые алгоритмы\n\nРешение задач по алгоритмам на языках Python и Go.\n\n---\n\n## 1. Введение в алгоритмы\n\n[contest.yandex.ru](https://contest.yandex.ru/contest/22450/problems/)\n\n---\n\n\u003cdetails\u003e\n\u003csummary\u003e\n\u003cb\u003eБлижайший ноль (\u003ca href=\"sprint_1/nearest_zero.py\"\u003enearest_zero.py\u003c/a\u003e)\u003c/b\u003e\n\u003c/summary\u003e\n\n#### Условие\nУлица, на которой хочет жить Тимофей, имеет длину n, то есть состоит из n одинаковых идущих подряд участков. \nНа каждом участке либо уже построен дом, либо участок пустой. \nТимофей ищет место для строительства своего дома. \nОн очень общителен и не хочет жить далеко от других людей, живущих на этой улице.\n\nЧтобы оптимально выбрать место для строительства, \nТимофей хочет для каждого участка знать расстояние до ближайшего пустого участка. \n(Для пустого участка эта величина будет равна нулю –— расстояние до самого себя).\n\nВаша задача –— помочь Тимофею посчитать искомые расстояния. \nДля этого у вас есть карта улицы. \nДома в городе Тимофея нумеровались в том порядке, в котором строились, \nпоэтому их номера на карте никак не упорядочены. Пустые участки обозначены нулями.\n\n#### Формат ввода\nВ первой строке дана длина улицы —– n (1 ≤ n ≤ 106). \nВ следующей строке записаны n целых неотрицательных чисел — номера домов и обозначения пустых участков на карте (нули). \nГарантируется, что в последовательности есть хотя бы один нуль. \nНомера домов (положительные числа) уникальны и не превосходят 10^9.\n\n#### Формат вывода\nДля каждого из участков выведите расстояние до ближайшего нуля. \nЧисла выводите в одну строку, разделяя их пробелами.\n\n#### Пример\n\u003ctable\u003e\u003ctbody\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003cb\u003eВвод\u003c/b\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003cb\u003eВывод\u003c/b\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd valign='top'\u003e\n5\u003cbr\u003e\n0 1 4 9 0\u003cbr\u003e\n\n\u003c/td\u003e\n  \u003ctd valign='top'\u003e\n0 1 2 1 0\u003cbr\u003e\n\u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/tbody\u003e\u003c/table\u003e\n\n\u003c/details\u003e\n\n------\n\n\u003cdetails\u003e\n\u003csummary\u003e\n\u003cb\u003eЛовкость рук (\u003ca href=\"sprint_1/juggle.py\"\u003ejuggle.py\u003c/a\u003e)\u003c/b\u003e\n\u003c/summary\u003e\n\n#### Условие\nГоша и Тимофей нашли необычный тренажёр для скоростной печати и хотят освоить его.\nТренажёр представляет собой поле из клавиш 4× 4, в котором на каждом раунде появляется конфигурация цифр и точек.\nНа клавише написана либо точка, либо цифра от 1 до 9.\nВ момент времени t игрок должен одновременно нажать на все клавиши, на которых написана цифра t.\nГоша и Тимофей могут нажать в один момент времени на k клавиш каждый.\nЕсли в момент времени t были нажаты все нужные клавиши, то игроки получают 1 балл.\n\nНайдите число баллов, которое смогут заработать Гоша и Тимофей, если будут нажимать на клавиши вдвоём.\n\n#### Формат ввода\nВ первой строке дано целое число k (1 ≤ k ≤ 5).\n\nВ четырёх следующих строках задан вид тренажёра –— по 4 символа в каждой строке.\nКаждый символ —– либо точка, либо цифра от 1 до 9.\nСимволы одной строки идут подряд и не разделены пробелами.\n\n#### Формат вывода\nВыведите единственное число –— максимальное количество баллов, которое смогут набрать Гоша и Тимофей.\n\n#### Пример\n\u003ctable\u003e\u003ctbody\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003cb\u003eВвод\u003c/b\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003cb\u003eВывод\u003c/b\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd valign='top'\u003e\n3\u003cbr\u003e\n1231\u003cbr\u003e\n2..2\u003cbr\u003e\n2..2\u003cbr\u003e\n2..2\u003cbr\u003e\n\n\u003c/td\u003e\n  \u003ctd valign='top'\u003e\n2\u003cbr\u003e\n\u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/tbody\u003e\u003c/table\u003e\n\n\u003c/details\u003e\n\n---\n\n\u003cdetails\u003e\n\u003csummary\u003e\n\u003cb\u003eРазница списков (\u003ca href=\"sprint_1/find_missing.py\"\u003efind_missing.py\u003c/a\u003e)\u003c/b\u003e\n\u003c/summary\u003e\n\n#### Условие\nДаны два списка, нужно вернуть элементы, которые есть в 1-ом списке, но нет во 2-ом. \nОценить эффективность своего решения.\n\n\u003c/details\u003e\n\n------\n\n\n\u003cdetails\u003e\n\u003csummary\u003e\n\u003cb\u003eУдаляем нули (\u003ca href=\"sprint_1/delete_zero.py\"\u003edelete_zero.py\u003c/a\u003e)\u003c/b\u003e\n\u003c/summary\u003e\n\n#### Условие\nДан массив целых чисел. Нужно удалить из него нули. \nМожно использовать только О(1) дополнительной памяти.\n\n\u003c/details\u003e\n\n----\n\n\n## 2. Основные структуры \n\n[contest.yandex.ru](https://contest.yandex.ru/contest/22779/problems/)\n\n---\n\n\u003cdetails\u003e\n\u003csummary\u003e\n\u003cb\u003eМониторинг (\u003ca href=\"sprint_2/monitoring.py\"\u003emonitoring.py\u003c/a\u003e)\u003c/b\u003e\n\u003c/summary\u003e\n\n#### Условие\nАлла получила задание, связанное с мониторингом работы различных серверов. \nТребуется понять, сколько времени обрабатываются определённые запросы на конкретных серверах. \nЭту информацию нужно хранить в матрице, где номер столбца соответствуют идентификатору запроса, \nа номер строки — идентификатору сервера. Алла перепутала строки и столбцы местами. \nС каждым бывает. Помогите ей исправить баг.\n\nЕсть матрица размера m × n. Нужно написать функцию, которая её транспонирует.\n\nТранспонированная матрица получается из исходной заменой строк на столбцы.\n\n#### Формат ввода\nВ первой строке задано число n — количество строк матрицы.\nВо второй строке задано m — число столбцов, m и n не превосходят 1000. В следующих n строках задана матрица. \nЧисла в ней не превосходят по модулю 1000.\n\n#### Формат вывода\nНапечатайте транспонированную матрицу в том же формате, который задан во входных данных. \nКаждая строка матрицы выводится на отдельной строке, элементы разделяются пробелами.\n\n#### Пример\n\u003ctable\u003e\u003ctbody\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003cb\u003eВвод\u003c/b\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003cb\u003eВывод\u003c/b\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd valign='top'\u003e\n4\u003cbr\u003e\n3\u003cbr\u003e\n1 2 3\u003cbr\u003e\n0 2 6\u003cbr\u003e\n7 4 1\u003cbr\u003e\n2 7 0\u003cbr\u003e\n\n\u003c/td\u003e\n  \u003ctd valign='top'\u003e\n1 0 7 2\u003cbr\u003e\n2 2 4 7\u003cbr\u003e\n3 6 1 0\u003cbr\u003e\n\u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/tbody\u003e\u003c/table\u003e\n\n\u003c/details\u003e\n\n---\n\n\u003cdetails\u003e\n\u003csummary\u003e\n\u003cb\u003eСтек - MaxEffective (\u003ca href=\"sprint_2/stack_max_effective.py\"\u003estack_max_effective.py\u003c/a\u003e)\u003c/b\u003e\n\u003c/summary\u003e\n\n#### Условие\nРеализуйте класс `StackMaxEffective`, \nподдерживающий операцию определения максимума среди элементов в стеке. \nСложность операции должна быть O(1). Для пустого стека операция должна возвращать `None`. \nПри этом `push(x)` и `pop()` также должны выполняться за константное время.\n\n#### Формат ввода\nВ первой строке записано одно число — количество команд, оно не превосходит 100000. \nДалее идут команды по одной в строке. Команды могут быть следующих видов:\n\n* `push(x)` — добавить число x в стек;\n* `pop()` — удалить число с вершины стека;\n* `get_max()` — напечатать максимальное число в стеке;\n\nЕсли стек пуст, при вызове команды get_max нужно напечатать «None», для команды pop — «error».\n\n#### Формат вывода\nДля каждой команды `get_max()` напечатайте результат её выполнения. \nЕсли стек пустой, для команды `get_max()` напечатайте «None». \nЕсли происходит удаление из пустого стека — напечатайте «error»\n\n#### Пример\n\u003ctable\u003e\u003ctbody\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003cb\u003eВвод\u003c/b\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003cb\u003eВывод\u003c/b\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd valign=\"top\"\u003e\n10\u003cbr\u003e\npop\u003cbr\u003e\npop\u003cbr\u003e\npush 4\u003cbr\u003e\npush -5\u003cbr\u003e\npush 7\u003cbr\u003e\npop\u003cbr\u003e\npop\u003cbr\u003e\nget_max\u003cbr\u003e\npop\u003cbr\u003e\nget_max\u003cbr\u003e\n\u003c/td\u003e\n    \u003ctd valign=\"top\"\u003e\nerror\u003cbr\u003e\nerror\u003cbr\u003e\n4\u003cbr\u003e\nNone\u003cbr\u003e\n\u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/tbody\u003e\u003c/table\u003e\n\n\u003c/details\u003e\n\n---\n\n\u003cdetails\u003e\n\u003csummary\u003e\n\u003cb\u003eСкобочная последовательность (\u003ca href=\"sprint_2/brackets.py\"\u003ebrackets.py\u003c/a\u003e)\u003c/b\u003e\n\u003c/summary\u003e\n\n#### Условие\nВот какую задачу Тимофей предложил на собеседовании одному из кандидатов. Если вы с ней ещё не сталкивались, то наверняка столкнётесь –— она довольно популярная.\n\nДана скобочная последовательность. Нужно определить, правильная ли она.\n\nБудем придерживаться такого определения:\n\n* пустая строка —– правильная скобочная последовательность;\n* правильная скобочная последовательность, взятая в скобки одного типа, –— правильная скобочная последовательность;\n* правильная скобочная последовательность с приписанной слева или справа правильной скобочной последовательностью —– тоже правильная.\n\nНа вход подаётся последовательность из скобок трёх видов: [], (), {}.\nНапишите функцию `is_correct_bracket_seq`, которая принимает на вход скобочную последовательность и возвращает `True`, \nесли последовательность правильная, а иначе `False`.\n\n#### Формат ввода\nНа вход подаётся одна строка, содержащая скобочную последовательность. Скобки записаны подряд, без пробелов.\n\n#### Формат вывода\nВыведите «True» или «False».\n\n#### Пример\n\u003ctable\u003e\u003ctbody\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003cb\u003eВвод\u003c/b\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003cb\u003eВывод\u003c/b\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd valign=\"top\"\u003e\n{[()]}\n\u003c/td\u003e\n    \u003ctd valign=\"top\"\u003e\nTrue\n\u003c/td\u003e\n  \u003c/tr\u003e\n\u003ctr\u003e\n    \u003ctd valign=\"top\"\u003e\n{}\n\u003c/td\u003e\n    \u003ctd valign=\"top\"\u003e\nTrue\n\u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/tbody\u003e\u003c/table\u003e\n\n\u003c/details\u003e\n\n---\n\n\u003cdetails\u003e\n\u003csummary\u003e\n\u003cb\u003eОграниченная очередь (\u003ca href=\"sprint_2/queue_sized.py\"\u003equeue_sized.py\u003c/a\u003e)\u003c/b\u003e\n\u003c/summary\u003e\n\n#### Условие\nАстрологи объявили день очередей ограниченного размера. \nТимофею нужно написать класс `MyQueueSized`, который принимает параметр `max_size`, \nозначающий максимально допустимое количество элементов в очереди.\n\nПомогите ему —– реализуйте программу, которая будет эмулировать работу такой очереди.\nФункции, которые надо поддержать, описаны в формате ввода.\n\n#### Формат ввода\nВ первой строке записано одно число — количество команд, оно не превосходит 5000.\nВо второй строке задан максимально допустимый размер очереди, он не превосходит 5000.\nДалее идут команды по одной на строке. Команды могут быть следующих видов:\n\n* `push(x)` — добавить число x в очередь;\n* `pop()` — удалить число из очереди и вывести на печать;\n* `peek()` — напечатать первое число в очереди;\n* `size()` — вернуть размер очереди;\nПри превышении допустимого размера очереди нужно вывести «error». \nПри вызове операций `pop()` или `peek()` для пустой очереди нужно вывести «None».\n\n#### Формат вывода\nНапечатайте результаты выполнения нужных команд, по одному на строке.\n\n#### Пример\n\u003ctable\u003e\u003ctbody\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003cb\u003eВвод\u003c/b\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003cb\u003eВывод\u003c/b\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd valign=\"top\"\u003e\n8\u003cbr\u003e\n2\u003cbr\u003e\npeek\u003cbr\u003e\npush 5\u003cbr\u003e\npush 2\u003cbr\u003e\npeek\u003cbr\u003e\nsize\u003cbr\u003e\nsize\u003cbr\u003e\npush 1\u003cbr\u003e\nsize\u003cbr\u003e\n\n\u003c/td\u003e\n    \u003ctd valign=\"top\"\u003e\nNone\u003cbr\u003e\n5\u003cbr\u003e\n2\u003cbr\u003e\n2\u003cbr\u003e\nerror\u003cbr\u003e\n2\u003cbr\u003e\n\n\u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/tbody\u003e\u003c/table\u003e\n\n\u003c/details\u003e\n\n---\n\n\u003cdetails\u003e\n\u003csummary\u003e\n\u003cb\u003eСписочная очередь (\u003ca href=\"sprint_2/queue_list.py\"\u003equeue_list.py\u003c/a\u003e)\u003c/b\u003e\n\u003c/summary\u003e\n\n#### Условие\nЛюбимый вариант очереди Тимофея — очередь, написанная с использованием связного списка. \nПомогите ему с реализацией. Очередь должна поддерживать выполнение трёх команд:\n\n* `get()` — вывести элемент, находящийся в голове очереди, и удалить его. Если очередь пуста, то вывести «error».\n* `put(x)` — добавить число x в очередь\n* `size()` — вывести текущий размер очереди\n\n#### Формат ввода\nВ первой строке записано количество команд n — целое число, не превосходящее 1000. \nВ каждой из следующих n строк записаны команды по одной строке.\n\n#### Формат вывода\nВыведите ответ на каждый запрос по одному в строке.\n\n#### Пример\n\u003ctable\u003e\u003ctbody\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003cb\u003eВвод\u003c/b\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003cb\u003eВывод\u003c/b\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd valign=\"top\"\u003e\n10\u003cbr\u003e\nput -34\u003cbr\u003e\nput -23\u003cbr\u003e\nget\u003cbr\u003e\nsize\u003cbr\u003e\nget\u003cbr\u003e\nsize\u003cbr\u003e\nget\u003cbr\u003e\nget\u003cbr\u003e\nput 80\u003cbr\u003e\nsize\u003cbr\u003e\n\n\u003c/td\u003e\n    \u003ctd valign=\"top\"\u003e\n-34\u003cbr\u003e\n1\u003cbr\u003e\n-23\u003cbr\u003e\n0\u003cbr\u003e\nerror\u003cbr\u003e\nerror\u003cbr\u003e\n1\u003cbr\u003e\n\n\u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/tbody\u003e\u003c/table\u003e\n\n\u003c/details\u003e\n\n---\n\n\u003cdetails\u003e\n\u003csummary\u003e\n\u003cb\u003eРекурсивные числа Фибоначчи (\u003ca href=\"sprint_2/fibonacci.py\"\u003efibonacci.py\u003c/a\u003e)\u003c/b\u003e\n\u003c/summary\u003e\n\n#### Условие\nУ Тимофея было n стажёров. \nКаждый стажёр хотел быть лучше своих предшественников, \nпоэтому стажёр делал столько коммитов, \nсколько делали два предыдущих стажёра в сумме. \nДва первых стажёра были менее инициативными —– они сделали по одному коммиту.\n\nОпределите, сколько кода напишет следующий стажёр.\nРешение должно быть реализовано рекурсивно.\n\n#### Формат ввода\nНа вход подаётся n — целое число в диапазоне от 0 до 32.\n\n#### Формат вывода\nНужно вывести, сколько кода напишет следующий стажёр.\n\n#### Пример\n\u003ctable\u003e\u003ctbody\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003cb\u003eВвод\u003c/b\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003cb\u003eВывод\u003c/b\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd valign=\"top\"\u003e\n3\n\u003c/td\u003e\n    \u003ctd valign=\"top\"\u003e\n3\n\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd valign=\"top\"\u003e\n0\n\u003c/td\u003e\n    \u003ctd valign=\"top\"\u003e\n1\n\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd valign=\"top\"\u003e\n1\n\u003c/td\u003e\n    \u003ctd valign=\"top\"\u003e\n1\n\u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/tbody\u003e\u003c/table\u003e\n\n\u003c/details\u003e\n\n---\n\n\u003cdetails\u003e\n\u003csummary\u003e\n\u003cb\u003eДек (\u003ca href=\"sprint_2/deck.py\"\u003edeck.py\u003c/a\u003e)\u003c/b\u003e\n\u003c/summary\u003e\n\n#### Условие\n\nГоша реализовал структуру данных Дек, максимальный размер которого определяется заданным числом. \nМетоды `push_back(x)`, `push_front(x)`, `pop_back()`, `pop_front()` работали корректно. \nНо, если в деке было много элементов, программа работала очень долго. \nДело в том, что не все операции выполнялись за O(1). \nПомогите Гоше! Напишите эффективную реализацию.\n\n**Внимание: при реализации нельзя использовать связный список.**\n\n#### Формат ввода\nВ первой строке записано количество команд n — целое число, не превосходящее 100000. Во второй строке записано число m — максимальный размер дека. Он не превосходит 50000. В следующих n строках записана одна из команд:\n\n* `push_back(value)` – добавить элемент в конец дека. Если в деке уже находится максимальное число элементов, вывести «error».\n* `push_front(value)` – добавить элемент в начало дека. Если в деке уже находится максимальное число элементов, вывести «error».\n* `pop_front()` – вывести первый элемент дека и удалить его. Если дек был пуст, то вывести «error».\n* `pop_back()` – вывести последний элемент дека и удалить его. Если дек был пуст, то вывести «error».\n`value` — целое число, по модулю не превосходящее 1000.\n\n#### Формат вывода\nВыведите результат выполнения каждой команды на отдельной строке. \nДля успешных запросов `push_back(x)` и `push_front(x)` ничего выводить не надо.\n\n#### Пример\n\u003ctable\u003e\u003ctbody\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003cb\u003eВвод\u003c/b\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003cb\u003eВывод\u003c/b\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd valign=\"top\"\u003e\n4\u003cbr\u003e\n4\u003cbr\u003e\npush_front 861\u003cbr\u003e\npush_front -819\u003cbr\u003e\npop_back\u003cbr\u003e\npop_back\u003cbr\u003e\n\n\u003c/td\u003e\n    \u003ctd valign=\"top\"\u003e\n861\u003cbr\u003e\n-819\u003cbr\u003e\n\n\u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/tbody\u003e\u003c/table\u003e\n\n\u003c/details\u003e\n\n---\n\n\u003cdetails\u003e\n\u003csummary\u003e\n\u003cb\u003eКалькулятор (\u003ca href=\"sprint_2/polsk_calc.py\"\u003epolsk_calc.py\u003c/a\u003e)\u003c/b\u003e\n\u003c/summary\u003e\n\n#### Условие\nЗадание связано с обратной польской нотацией. \nОна используется для парсинга арифметических выражений. \nЕще её иногда называют постфиксной нотацией.\n\nВ постфиксной нотации операнды расположены перед знаками операций.\n\n**Пример:**\n\n10 2 4 * \n\nозначает 10 - 2 * 4 и равно 2\n\nРазберём последний пример подробнее:\n\nЗнак * стоит сразу после чисел 2 и 4, значит к ним нужно применить операцию, которую этот знак обозначает, то есть перемножить эти два числа. В результате получим 8.\n\nПосле этого выражение приобретёт вид:\n\n10 8 -\n\nОперацию «минус» нужно применить к двум идущим перед ней числам, то есть 10 и 8. В итоге получаем 2.\n\nРассмотрим алгоритм более подробно. Для его реализации будем использовать стек.\n\nДля вычисления значения выражения, записанного в обратной польской нотации, \nнужно считывать выражение слева направо и придерживаться следующих шагов:\n\n1. Обработка входного символа:\nЕсли на вход подан операнд, он помещается на вершину стека.\nЕсли на вход подан знак операции, то эта операция выполняется над требуемым количеством значений, взятых из стека в порядке добавления. Результат выполненной операции помещается на вершину стека.\n2. Если входной набор символов обработан не полностью, перейти к шагу 1.\n3. После полной обработки входного набора символов результат вычисления выражения находится в вершине стека. Если в стеке осталось несколько чисел, то надо вывести только верхний элемент.\n\n**Замечание про отрицательные числа и деление:** \nв этой задаче под делением понимается математическое целочисленное деление. \nЭто значит, что округление всегда происходит вниз. \nА именно: если a / b = c, то b ⋅ c — это наибольшее число, \nкоторое не превосходит a и одновременно делится без остатка на b.\n\nНапример, -1 / 3 = -1. Будьте осторожны: в C++, Java и Go, например, деление чисел работает иначе.\n\nВ текущей задаче гарантируется, что деления на отрицательное число нет.\n\n#### Формат ввода\nВ единственной строке дано выражение, записанное в обратной польской нотации. Числа и арифметические операции записаны через пробел.\n\nНа вход могут подаваться операции: +, -, *, / и числа, по модулю не превосходящие 10000.\n\nГарантируется, что значение промежуточных выражений в тестовых данных по модулю не больше 50000.\n\n#### Формат вывода\nВыведите единственное число — значение выражения.\n\n#### Пример\n\u003ctable\u003e\u003ctbody\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003cb\u003eВвод\u003c/b\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003cb\u003eВывод\u003c/b\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd valign=\"top\"\u003e\n2 1 + 3 *\n\n\u003c/td\u003e\n    \u003ctd valign=\"top\"\u003e\n9\n\n\u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/tbody\u003e\u003c/table\u003e\n\n\u003c/details\u003e\n\n---\n\n## 3. Рекурсия и сортировки \n\n[contest.yandex.ru](https://contest.yandex.ru/contest/23638/problems/)\n\n---\n\n\u003cdetails\u003e\n\u003csummary\u003e\n\u003cb\u003eГенератор скобок (\u003ca href=\"sprint_3/brackets_generator.py\"\u003ebrackets_generator.py\u003c/a\u003e)\u003c/b\u003e\n\u003c/summary\u003e\n\n#### Условие\nРита по поручению Тимофея наводит порядок в правильных скобочных последовательностях (ПСП),\nсостоящих только из круглых скобок (). \nДля этого ей надо сгенерировать все ПСП длины 2n в алфавитном порядке —– \nалфавит состоит из ( и ) и открывающая скобка идёт раньше закрывающей.\n\nПомогите Рите —– напишите программу, \nкоторая по заданному n выведет все ПСП в нужном порядке.\n\n\nРассмотрим второй пример. Надо вывести ПСП из четырёх символов. Таких всего две:\n\n* (())\n* ()()\n\n(()) идёт раньше ()(), так как первый символ у них одинаковый, а на второй позиции у первой ПСП стоит (, который идёт раньше ).\n\n#### Формат ввода\nНа вход функция принимает n — целое число от 0 до 10.\n\n#### Формат вывода\nФункция должна напечатать все возможные скобочные последовательности заданной длины в алфавитном (лексикографическом) порядке.\n\n#### Пример\n\u003ctable\u003e\u003ctbody\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003cb\u003eВвод\u003c/b\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003cb\u003eВывод\u003c/b\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd valign=\"top\"\u003e\n3\u003cbr\u003e\n\n\u003c/td\u003e\n    \u003ctd valign=\"top\"\u003e\n((()))\u003cbr\u003e\n(()())\u003cbr\u003e\n(())()\u003cbr\u003e\n()(())\u003cbr\u003e\n()()()\u003cbr\u003e\n\n\u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/tbody\u003e\u003c/table\u003e\n\n\u003c/details\u003e\n\n---\n\n\u003cdetails\u003e\n\u003csummary\u003e\n\u003cb\u003eКомбинации (\u003ca href=\"sprint_3/combinations.py\"\u003ecombinations.py\u003c/a\u003e)\u003c/b\u003e\n\u003c/summary\u003e\n\n#### Условие\nНа клавиатуре старых мобильных телефонов каждой цифре соответствовало несколько букв. \n\nПримерно так:\n2:'abc',\n3:'def',\n4:'ghi',\n5:'jkl',\n6:'mno',\n7:'pqrs',\n8:'tuv',\n9:'wxyz'\n\nВам известно в каком порядке были нажаты кнопки телефона, без учета повторов. \nНапечатайте все комбинации букв, которые можно набрать такой последовательностью нажатий.\n\n#### Формат ввода\nНа вход подается строка, состоящая из цифр 2-9 включительно. Длина строки не превосходит 10 символов.\n\n#### Формат вывода\nВыведите все возможные комбинации букв через пробел.\n\n#### Пример\n\u003ctable\u003e\u003ctbody\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003cb\u003eВвод\u003c/b\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003cb\u003eВывод\u003c/b\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd valign=\"top\"\u003e\n23\u003cbr\u003e\n\n\u003c/td\u003e\n    \u003ctd valign=\"top\"\u003e\nad ae af bd be bf cd ce cf\u003cbr\u003e\n\n\u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/tbody\u003e\u003c/table\u003e\n\n\u003c/details\u003e\n\n---\n\n\u003cdetails\u003e\n\u003csummary\u003e\n\u003cb\u003eПодпоследовательность (\u003ca href=\"sprint_3/subsequence.py\"\u003esubsequence.py\u003c/a\u003e)\u003c/b\u003e\n\u003c/summary\u003e\n\n#### Условие\nГоша любит играть в игру «Подпоследовательность»: \nданы 2 строки, и нужно понять, является ли первая из них подпоследовательностью второй.\n\nКогда строки достаточно длинные, очень трудно получить ответ на этот вопрос, \nпросто посмотрев на них. Помогите Гоше написать функцию, которая решает эту задачу.\n\n#### Формат ввода\nВ первой строке записана строка s.\n\nВо второй —- строка t.\n\nОбе строки состоят из маленьких латинских букв, длины строк не превосходят 150000. \nСтроки могут быть пустыми.\n\n#### Формат вывода\nВыведите True, если s является подпоследовательностью t, иначе —– False.\n\n#### Пример\n\u003ctable\u003e\u003ctbody\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003cb\u003eВвод\u003c/b\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003cb\u003eВывод\u003c/b\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd valign=\"top\"\u003e\nabc\u003cbr\u003e\nahbgdcu\u003cbr\u003e\n\n\u003c/td\u003e\n    \u003ctd valign=\"top\"\u003e\nTrue\u003cbr\u003e\n\n\u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/tbody\u003e\u003c/table\u003e\n\n\u003c/details\u003e\n\n---\n\n\u003cdetails\u003e\n\u003csummary\u003e\n\u003cb\u003eПеченьки (\u003ca href=\"sprint_3/crackers.py\"\u003ecrackers.py\u003c/a\u003e)\u003c/b\u003e\n\u003c/summary\u003e\n\n#### Условие\nК Васе в гости пришли одноклассники. Его мама решила угостить ребят печеньем.\n\nНо не всё так просто. Печенья могут быть разного размера. \nА у каждого ребёнка есть фактор жадности —– минимальный размер печенья, \nкоторое он возьмёт. Нужно выяснить, сколько ребят останутся довольными в лучшем случае, \nкогда они действуют оптимально.\n\nКаждый ребёнок может взять не больше одного печенья.\n\n#### Формат ввода\nВ первой строке записано n —– количество детей.\n\nВо второй —– n чисел, разделённых пробелом, каждое из которых –— фактор жадности ребёнка. \nЭто натуральные числа, не превосходящие 1000.\n\nВ следующей строке записано число m –— количество печенек.\n\nДалее —– m натуральных чисел, разделённых пробелом —– размеры печенек. \nРазмеры печенек не превосходят 1000.\n\nОба числа n и m не превосходят 10000.\n#### Формат вывода\nНужно вывести одно число –— количество детей, которые останутся довольными\n\n#### Пример\n\u003ctable\u003e\u003ctbody\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003cb\u003eВвод\u003c/b\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003cb\u003eВывод\u003c/b\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd valign=\"top\"\u003e\n2\u003cbr\u003e\n1 2\u003cbr\u003e\n3\u003cbr\u003e\n2 1 3\u003cbr\u003e\n\n\u003c/td\u003e\n    \u003ctd valign=\"top\"\u003e\n2\u003cbr\u003e\n\n\u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/tbody\u003e\u003c/table\u003e\n\n\u003c/details\u003e\n\n---\n\n\u003cdetails\u003e\n\u003csummary\u003e\n\u003cb\u003eПериметр треугольника (\u003ca href=\"sprint_3/triangles.py\"\u003etriangles.py\u003c/a\u003e)\u003c/b\u003e\n\u003c/summary\u003e\n\n#### Условие\nПеред сном Рита решила поиграть в игру на телефоне. \nДан массив целых чисел, в котором каждый элемент обозначает длину стороны треугольника. \nНужно определить максимально возможный периметр треугольника, \nсоставленного из сторон с длинами из заданного массива. \nПомогите Рите скорее закончить игру и пойти спать.\n\nНапомним, что из трёх отрезков с длинами a ≤ b ≤ c можно составить треугольник, \nесли выполнено неравенство треугольника: c \u003c a + b\n\nРазберём пример:\nданы длины сторон 6, 3, 3, 2. Попробуем в качестве наибольшей стороны выбрать 6. \nНеравенство треугольника не может выполниться, \nтак как остались 3, 3, 2 —– максимальная сумма из них равна 6.\n\nБез шестёрки оставшиеся три отрезка уже образуют треугольник со сторонами 3, 3, 2.\nНеравенство выполняется: 3 \u003c 3 + 2. Периметр равен 3 + 3 + 2 = 8.\n\n#### Формат ввода\nВ первой строке записано количество отрезков n, 3≤ n≤ 10000.\n\nВо второй строке записано n натуральных чисел, не превосходящих 10 000, –— длины отрезков.\n\n#### Формат вывода\nНужно вывести одно число —– наибольший периметр треугольника.\n\n#### Пример\n\u003ctable\u003e\u003ctbody\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003cb\u003eВвод\u003c/b\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003cb\u003eВывод\u003c/b\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd valign=\"top\"\u003e\n4\u003cbr\u003e\n6 3 3 2\u003cbr\u003e\n\n\u003c/td\u003e\n    \u003ctd valign=\"top\"\u003e\n8\u003cbr\u003e\n\n\u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/tbody\u003e\u003c/table\u003e\n\n\u003c/details\u003e\n\n---\n\n\u003cdetails\u003e\n\u003csummary\u003e\n\u003cb\u003eГардероб (\u003ca href=\"sprint_3/closet.py\"\u003ecloset.py\u003c/a\u003e)\u003c/b\u003e\n\u003c/summary\u003e\n\n#### Условие\nРита решила оставить у себя одежду только трёх цветов: розового, жёлтого и малинового. \nПосле того как вещи других расцветок были убраны, \nРита захотела отсортировать свой новый гардероб по цветам. \nСначала должны идти вещи розового цвета, потом —– жёлтого, и в конце —– малинового. \nПомогите Рите справиться с этой задачей.\n\nПримечание: попробуйте решить задачу за один проход по массиву!\n\n#### Формат ввода\nВ первой строке задано количество предметов в гардеробе: n –— оно не превосходит 1000000.\nВо второй строке даётся массив, в котором указан цвет для каждого предмета.\nРозовый цвет обозначен 0, жёлтый —– 1, малиновый –— 2.\n\n#### Формат вывода\nНужно вывести в строку через пробел цвета предметов в правильном порядке.\n\n#### Пример\n\u003ctable\u003e\u003ctbody\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003cb\u003eВвод\u003c/b\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003cb\u003eВывод\u003c/b\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd valign=\"top\"\u003e\n7\u003cbr\u003e\n0 2 1 2 0 0 1\u003cbr\u003e\n\n\u003c/td\u003e\n    \u003ctd valign=\"top\"\u003e\n0 0 0 1 1 2 2\u003cbr\u003e\n\n\u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/tbody\u003e\u003c/table\u003e\n\n\u003c/details\u003e\n\n---\n\n\u003cdetails\u003e\n\u003csummary\u003e\n\u003cb\u003eБольшое число (\u003ca href=\"sprint_3/big_number.py\"\u003ebig_number.py\u003c/a\u003e)\u003c/b\u003e\n\u003c/summary\u003e\n\n#### Условие\nВечером ребята решили поиграть в игру «Большое число».\n\nДаны числа. Нужно определить, какое самое большое число можно из них составить.\n\n#### Формат ввода\nВ первой строке записано n — количество чисел. Оно не превосходит 100.\nВо второй строке через пробел записаны n неотрицательных чисел, каждое из которых не превосходит 1000.\n\n#### Формат вывода\nНужно вывести самое большое число, которое можно составить из данных чисел.\n\n#### Пример\n\u003ctable\u003e\u003ctbody\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003cb\u003eВвод\u003c/b\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003cb\u003eВывод\u003c/b\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd valign=\"top\"\u003e\n3\u003cbr\u003e\n15 56 2\u003cbr\u003e\n\n\u003c/td\u003e\n    \u003ctd valign=\"top\"\u003e\n56215\u003cbr\u003e\n\n\u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/tbody\u003e\u003c/table\u003e\n\n\u003c/details\u003e\n\n---\n\n\u003cdetails\u003e\n\u003csummary\u003e\n\u003cb\u003eПузырёк (\u003ca href=\"sprint_3/bubble.py\"\u003ebubble.py\u003c/a\u003e)\u003c/b\u003e\n\u003c/summary\u003e\n\n#### Условие\nЧтобы выбрать самый лучший алгоритм для решения задачи, Гоша продолжил изучать разные сортировки. \nНа очереди сортировка пузырьком — https://ru.wikipedia.org/wiki/Сортировка_пузырьком\n\nЕё алгоритм следующий (сортируем по неубыванию):\n\nНа каждой итерации проходим по массиву, поочередно сравнивая пары соседних элементов. \nЕсли элемент на позиции i больше элемента на позиции i + 1, меняем их местами. \nПосле первой итерации самый большой элемент всплывёт в конце массива.\nПроходим по массиву, выполняя указанные действия до тех пор, \nпока на очередной итерации не окажется, что обмены больше не нужны, \nто есть массив уже отсортирован.\nПосле не более чем n – 1 итераций выполнение алгоритма заканчивается, \nтак как на каждой итерации хотя бы один элемент оказывается на правильной позиции.\n\nПомогите Гоше написать код алгоритма.\n\n#### Формат ввода\nВ первой строке на вход подаётся натуральное число n — длина массива, 2 ≤ n ≤ 1000.\nВо второй строке через пробел записано n целых чисел.\nКаждое из чисел по модулю не превосходит 1000.\n\nОбратите внимание, что считывать нужно только 2 строки: значение n и входной массив.\n\n#### Формат вывода\nПосле каждого прохода по массиву, на котором какие-то элементы меняются местами, \nвыводите его промежуточное состояние.\nТаким образом, если сортировка завершена за k меняющих массив итераций, \nто надо вывести k строк по n чисел в каждой — элементы массива после каждой из итераций.\nЕсли массив был изначально отсортирован, то просто выведите его.\n\n#### Пример\n\u003ctable\u003e\u003ctbody\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003cb\u003eВвод\u003c/b\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003cb\u003eВывод\u003c/b\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd valign=\"top\"\u003e\n5\u003cbr\u003e\n4 3 9 2 1\u003cbr\u003e\n\n\u003c/td\u003e\n    \u003ctd valign=\"top\"\u003e\n3 4 2 1 9\u003cbr\u003e\n3 2 1 4 9\u003cbr\u003e\n2 1 3 4 9\u003cbr\u003e\n1 2 3 4 9\u003cbr\u003e\n\n\u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/tbody\u003e\u003c/table\u003e\n\n\u003c/details\u003e\n\n---\n\n\u003cdetails\u003e\n\u003csummary\u003e\n\u003cb\u003eПоиск в сломанном массиве (\u003ca href=\"sprint_3/broken_search.py\"\u003ebroken_search.py\u003c/a\u003e)\u003c/b\u003e\n\u003c/summary\u003e\n\n#### Условие\nАлла ошиблась при копировании из одной структуры данных в другую. \nОна хранила массив чисел в кольцевом буфере. \nМассив был отсортирован по возрастанию, \nи в нём можно было найти элемент за логарифмическое время. \nАлла скопировала данные из кольцевого буфера в обычный массив, \nно сдвинула данные исходной отсортированной последовательности. \nТеперь массив не является отсортированным. \nТем не менее нужно обеспечить возможность находить в нем элемент за O(log n).\nМожно предполагать, что в массиве только уникальные элементы.\n\n#### Формат ввода\nФункция принимает массив натуральных чисел и искомое число k. \nДлина массива не превосходит 10000. \nЭлементы массива и число k не превосходят по значению 10000.\n\nВ примерах:\nВ первой строке записано число n — длина массива.\nВо второй строке записано положительное число k — искомый элемент. \nДалее в строку через пробел записано n натуральных чисел – элементы массива.\n\n#### Формат вывода\nФункция должна вернуть индекс элемента, равного k, \nесли такой есть в массиве (нумерация с нуля). \nЕсли элемент не найден, функция должна вернуть − 1.\nИзменять массив нельзя.\n\n#### Пример\n\u003ctable\u003e\u003ctbody\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003cb\u003eВвод\u003c/b\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003cb\u003eВывод\u003c/b\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd valign=\"top\"\u003e\n9\u003cbr\u003e\n5\u003cbr\u003e\n19 21 100 101 1 4 5 7 12\u003cbr\u003e\n\n\u003c/td\u003e\n    \u003ctd valign=\"top\"\u003e\n6\n\n\u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/tbody\u003e\u003c/table\u003e\n\n\u003c/details\u003e\n\n---\n\n\u003cdetails\u003e\n\u003csummary\u003e\n\u003cb\u003eЭффективная быстрая сортировка (\u003ca href=\"sprint_3/efficient_quick_sort.py\"\u003eefficient_quick_sort.py\u003c/a\u003e)\u003c/b\u003e\n\u003c/summary\u003e\n\n#### Условие\nТимофей решил организовать соревнование по спортивному программированию, \nчтобы найти талантливых стажёров. \nЗадачи подобраны, участники зарегистрированы, тесты написаны. \nОсталось придумать, как в конце соревнования будет определяться победитель.\n\n\nКаждый участник имеет уникальный логин. \nКогда соревнование закончится, к нему будут привязаны два показателя: \nколичество решённых задач P_i и размер штрафа F_i. \nШтраф начисляется за неудачные попытки и время, затраченное на задачу.\n\n\nТимофей решил сортировать таблицу результатов следующим образом: \nпри сравнении двух участников выше будет идти тот, у которого решено больше задач. \nПри равенстве числа решённых задач первым идёт участник с меньшим штрафом. \nЕсли же и штрафы совпадают, то первым будет тот, \nу которого логин идёт раньше в алфавитном (лексикографическом) порядке.\n\n\nТимофей заказал толстовки для победителей и накануне поехал за ними в магазин. \nВ своё отсутствие он поручил вам реализовать алгоритм быстрой сортировки (англ. quick sort) для таблицы результатов. Так как Тимофей любит спортивное программирование и не любит зря расходовать оперативную память, то ваша реализация сортировки не может потреблять O(n) дополнительной памяти для промежуточных данных (такая модификация быстрой сортировки называется \"in-place\").\n\n\n**Как работает in-place quick sort**\n\nКак и в случае обычной быстрой сортировки, которая использует дополнительную память, \nнеобходимо выбрать опорный элемент (англ. pivot), а затем переупорядочить массив.\nСделаем так, чтобы сначала шли элементы, не превосходящие опорного, а затем —– большие опорного.\n\n\nЗатем сортировка вызывается рекурсивно для двух полученных частей. \nИменно на этапе разделения элементов на группы в обычном алгоритме используется дополнительная память. \nТеперь разберёмся, как реализовать этот шаг in-place.\n\nПусть мы как-то выбрали опорный элемент. Заведём два указателя left и right, \nкоторые изначально будут указывать на левый и правый концы отрезка соответственно. \nЗатем будем двигать левый указатель вправо до тех пор, пока он указывает на элемент, \nменьший опорного. Аналогично двигаем правый указатель влево, пока он стоит на элементе,\nпревосходящем опорный. \nВ итоге окажется, что левее от left все элементы точно принадлежат первой группе, \nа правее от right — второй. Элементы, на которых стоят указатели, нарушают порядок. \nПоменяем их местами (в большинстве языков программирования используется функция swap()) \nи продвинем указатели на следующие элементы. \nБудем повторять это действие до тех пор, пока left и right не столкнутся.\n\n#### Формат ввода\nВ первой строке задано число участников n, 1 ≤ n ≤ 100 000.\nВ каждой из следующих n строк задана информация про одного из участников.\ni-й участник описывается тремя параметрами:\n\n* уникальным логином (строкой из маленьких латинских букв длиной не более 20)\n* числом решённых задач P_i\n* штрафом Fi\n\nFi и Pi — целые числа, лежащие в диапазоне от 0 до 10^9.\n\n#### Формат вывода\nДля отсортированного списка участников выведите по порядку их логины по одному в строке.\n\n#### Пример\n\u003ctable\u003e\u003ctbody\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003cb\u003eВвод\u003c/b\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003cb\u003eВывод\u003c/b\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd valign=\"top\"\u003e\n5\u003cbr\u003e\nalla 4 100\u003cbr\u003e\ngena 6 1000\u003cbr\u003e\ngosha 2 90\u003cbr\u003e\nrita 2 90\u003cbr\u003e\ntimofey 4 80\u003cbr\u003e\n\n\u003c/td\u003e\n    \u003ctd valign=\"top\"\u003e\ngena\u003cbr\u003e\ntimofey\u003cbr\u003e\nalla\u003cbr\u003e\ngosha\u003cbr\u003e\nrita\u003cbr\u003e\n\n\u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/tbody\u003e\u003c/table\u003e\n\n\u003c/details\u003e\n\n---\n\n## 4. Хеш-функции\n\n[contest.yandex.ru](https://contest.yandex.ru/contest/23991/problems/)\n\n---\n\n\u003cdetails\u003e\n\u003csummary\u003e\n\u003cb\u003eПолиномиальный хеш (\u003ca href=\"sprint_4/polynomial_hash.py\"\u003epolynomial_hash.py\u003c/a\u003e)\u003c/b\u003e\n\u003c/summary\u003e\n\n#### Условие\nАлле очень понравился алгоритм вычисления полиномиального хеша. \nПомогите ей написать функцию, вычисляющую хеш строки s. \nВ данной задаче необходимо использовать в качестве значений отдельных символов их коды в таблице ASCII.\n\n#### Формат ввода\nВ первой строке дано число a (1 ≤ a ≤ 1000) –— основание, по которому считается хеш.\n\nВо второй строке дано число m (1 ≤ m ≤ 109) –— модуль.\n\nВ третьей строке дана строка s (0 ≤ |s| ≤ 106), состоящая из больших и маленьких латинских букв.\n\n#### Формат вывода\nВыведите целое неотрицательное число –— хеш заданной строки.\n\n\n#### Пример\n\u003ctable\u003e\u003ctbody\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003cb\u003eВвод\u003c/b\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003cb\u003eВывод\u003c/b\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd valign=\"top\"\u003e\n123\u003cbr\u003e\n100003\u003cbr\u003e\na\u003cbr\u003e\n\n\u003c/td\u003e\n    \u003ctd valign=\"top\"\u003e\n97\u003cbr\u003e\n\n\u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/tbody\u003e\u003c/table\u003e\n\n\u003c/details\u003e\n\n---\n\n\u003cdetails\u003e\n\u003csummary\u003e\n\u003cb\u003eСломай меня (\u003ca href=\"sprint_4/crash_polynomial_hash.py\"\u003ecrash_polynomial_hash.py\u003c/a\u003e)\u003c/b\u003e\n\u003c/summary\u003e\n\n#### Условие\nГоша написал программу, которая сравнивает строки исключительно по их хешам. \nЕсли хеш равен, то и строки равны. \nТимофей увидел это безобразие и поручил вам сломать программу Гоши, чтобы остальным неповадно было.\n\nВ этой задаче вам надо будет лишь найти две различные строки, \nкоторые для заданной хеш-функции будут давать одинаковое значение.\n\n#### Формат ввода\nВ задаче единственный тест без ввода\n\n#### Формат вывода\nОтправьте две строки, по одной в строке. Строки могут состоять только из маленьких латинских букв и не должны превышать в длину 1000 знаков каждая. Код отправлять не требуется. Строки из примера использовать нельзя.\n\nПример вывода:\n\n* ezhgeljkablzwnvuwqvp\n* gbpdcvkumyfxillgnqrv\n\n\n\u003c/details\u003e\n\n\n---\n\n\u003cdetails\u003e\n\u003csummary\u003e\n\u003cb\u003eПрефиксные хеши (\u003ca href=\"sprint_4/prefix_hash.py\"\u003eprefix_hash.py\u003c/a\u003e)\u003c/b\u003e\n\u003c/summary\u003e\n\n#### Условие\nАлла не остановилась на достигнутом –— \nтеперь она хочет научиться быстро вычислять хеши произвольных подстрок данной строки. \nПомогите ей!\n\nНа вход поступают запросы на подсчёт хешей разных подстрок. \nОтвет на каждый запрос должен выполняться за O(1). \nДопустимо в начале работы программы сделать предподсчёт для дальнейшей работы со строкой.\n\nВ данной задаче необходимо использовать в качестве значений отдельных символов их коды в таблице ASCII.\n\n#### Формат ввода\nВ первой строке дано число a (1 ≤ a ≤ 1000) –— основание, \nпо которому считается хеш. \nВо второй строке дано число m (1 ≤ m ≤ 107) –— модуль. \nВ третьей строке дана строка s (0 ≤ |s| ≤ 106), состоящая из больших и маленьких латинских букв.\n\nВ четвертой строке дано число запросов t –— натуральное число от 1 до 105. \nВ каждой из следующих t строк записаны через пробел два числа l и r –— индексы начала и конца очередной подстроки. \n(1 ≤ l ≤ r ≤ |s|).\n\n#### Формат вывода\nДля каждого запроса выведите на отдельной строке хеш заданной в запросе подстроки.\n\n#### Пример\n\u003ctable\u003e\u003ctbody\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003cb\u003eВвод\u003c/b\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003cb\u003eВывод\u003c/b\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd valign=\"top\"\u003e\n1000\u003cbr\u003e\n1000009\u003cbr\u003e\nabcdefgh\u003cbr\u003e\n7\u003cbr\u003e\n1 1\u003cbr\u003e\n1 5\u003cbr\u003e\n2 3\u003cbr\u003e\n3 4\u003cbr\u003e\n4 4\u003cbr\u003e\n1 8\u003cbr\u003e\n5 8\u003cbr\u003e\n\n\n\u003c/td\u003e\n    \u003ctd valign=\"top\"\u003e\n97\u003cbr\u003e\n225076\u003cbr\u003e\n98099\u003cbr\u003e\n99100\u003cbr\u003e\n100\u003cbr\u003e\n436420\u003cbr\u003e\n193195\u003cbr\u003e\n\n\u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/tbody\u003e\u003c/table\u003e\n\n\u003c/details\u003e\n\n---\n\n\u003cdetails\u003e\n\u003csummary\u003e\n\u003cb\u003eКружки (\u003ca href=\"sprint_4/bocals.py\"\u003ebocals.py\u003c/a\u003e)\u003c/b\u003e\n\u003c/summary\u003e\n\n#### Условие\nВ компании, где работает Тимофей, \nзаботятся о досуге сотрудников и устраивают различные кружки по интересам. \nКогда кто-то записывается на занятие, в лог вносится название кружка.\n\nПо записям в логе составьте список всех кружков, \nв которые ходит хотя бы один человек.\n\n#### Формат ввода\nВ первой строке даётся натуральное число n, не превосходящее 10 000 –— количество записей в логе.\n\nВ следующих n строках —– названия кружков.\n\n#### Формат вывода\nВыведите уникальные названия кружков по одному на строке, в порядке появления во входных данных.\n\n\n#### Пример\n\u003ctable\u003e\u003ctbody\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003cb\u003eВвод\u003c/b\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003cb\u003eВывод\u003c/b\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd valign=\"top\"\u003e\n8\u003cbr\u003e\nвышивание крестиком\u003cbr\u003e\nрисование мелками на парте\u003cbr\u003e\nнастольный керлинг\u003cbr\u003e\nнастольный керлинг\u003cbr\u003e\nкухня африканского племени ужасмай\u003cbr\u003e\nтяжелая атлетика\u003cbr\u003e\nтаракановедение\u003cbr\u003e\nтаракановедение\u003cbr\u003e\n\n\u003c/td\u003e\n    \u003ctd valign=\"top\"\u003e\nвышивание крестиком\u003cbr\u003e\nрисование мелками на парте\u003cbr\u003e\nнастольный керлинг\u003cbr\u003e\nкухня африканского племени ужасмай\u003cbr\u003e\nтяжелая атлетика\u003cbr\u003e\nтаракановедение\u003cbr\u003e\n\n\n\u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/tbody\u003e\u003c/table\u003e\n\n\u003c/details\u003e\n\n---\n\n\u003cdetails\u003e\n\u003csummary\u003e\n\u003cb\u003eПодстроки (\u003ca href=\"sprint_4/substrings.py\"\u003esubstrings.py\u003c/a\u003e)\u003c/b\u003e\n\u003c/summary\u003e\n\n#### Условие\nНа вход подается строка. \nНужно определить длину наибольшей подстроки, которая не содержит повторяющиеся символы.\n\n#### Формат ввода\nОдна строка, состоящая из строчных латинских букв. Длина строки не превосходит 10 000.\n\n#### Формат вывода\nВыведите натуральное число —– ответ на задачу.\n\n\n#### Пример\n\u003ctable\u003e\u003ctbody\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003cb\u003eВвод\u003c/b\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003cb\u003eВывод\u003c/b\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd valign=\"top\"\u003e\nabcabcbb\u003cbr\u003e\n\n\u003c/td\u003e\n    \u003ctd valign=\"top\"\u003e\n3\u003cbr\u003e\n\n\n\u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/tbody\u003e\u003c/table\u003e\n\n\u003c/details\u003e\n\n---\n\n\u003cdetails\u003e\n\u003csummary\u003e\n\u003cb\u003eПоисковая система (\u003ca href=\"sprint_4/search_system.py\"\u003esearch_system.py\u003c/a\u003e)\u003c/b\u003e\n\u003c/summary\u003e\n\n#### Условие\nТимофей пишет свою поисковую систему.\n\nИмеется n документов, каждый из которых представляет собой текст из слов. \nПо этим документам требуется построить поисковый индекс. \nНа вход системе будут подаваться запросы. \nЗапрос —– некоторый набор слов. \nПо запросу надо вывести 5 самых релевантных документов.\n\nРелевантность документа оценивается следующим образом: \nдля каждого уникального слова из запроса берётся число его вхождений в документ, \nполученные числа для всех слов из запроса суммируются. \nИтоговая сумма и является релевантностью документа. \nЧем больше сумма, тем больше документ подходит под запрос.\n\nСортировка документов на выдаче производится по убыванию релевантности. \nЕсли релевантности документов совпадают —– то по возрастанию их порядковых номеров в базе \n(то есть во входных данных).\n\n#### Формат ввода\nВ первой строке дано натуральное число n —– количество документов в базе (1 ≤ n ≤ 104).\n\nДалее в n строках даны документы по одному в строке. Каждый документ состоит из нескольких слов, \nслова отделяются друг от друга одним пробелом и состоят из маленьких латинских букв. \nДлина одного текста не превосходит 1000 символов. Текст не бывает пустым.\n\nВ следующей строке дано число запросов —– натуральное число m (1 ≤ m ≤ 104). \nВ следующих m строках даны запросы по одному в строке. \nКаждый запрос состоит из одного или нескольких слов. \nЗапрос не бывает пустым. \nСлова отделяются друг от друга одним пробелом и состоят из маленьких латинских букв. \nЧисло символов в запросе не превосходит 100.\n\n#### Формат вывода\nДля каждого запроса выведите на одной строке номера пяти самых релевантных документов. \nЕсли нашлось менее пяти документов, то выведите столько, сколько нашлось. \nДокументы с релевантностью 0 выдавать не нужно.\n\n#### Пример\n\u003ctable\u003e\u003ctbody\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003cb\u003eВвод\u003c/b\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003cb\u003eВывод\u003c/b\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd valign=\"top\"\u003e\n3\u003cbr\u003e\ni love coffee\u003cbr\u003e\ncoffee with milk and sugar\u003cbr\u003e\nfree tea for everyone\u003cbr\u003e\n3\u003cbr\u003e\ni like black coffee without milk\u003cbr\u003e\neveryone loves new year\u003cbr\u003e\nmary likes black coffee without milk\u003cbr\u003e\n\n\u003c/td\u003e\n    \u003ctd valign=\"top\"\u003e\n1 2\u003cbr\u003e\n3\u003cbr\u003e\n2 1\u003cbr\u003e\n\n\u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/tbody\u003e\u003c/table\u003e\n\n\u003c/details\u003e\n\n---\n\n\u003cdetails\u003e\n\u003csummary\u003e\n\u003cb\u003eХеш-таблица (\u003ca href=\"sprint_4/hash_table.py\"\u003ehash_table.py\u003c/a\u003e)\u003c/b\u003e\n\u003c/summary\u003e\n\n#### Условие\nТимофей, как хороший руководитель, \nхранит информацию о зарплатах своих сотрудников в базе данных и постоянно её обновляет. \nОн поручил вам написать реализацию хеш-таблицы, \nчтобы хранить в ней базу данных с зарплатами сотрудников.\n\nХеш-таблица должна поддерживать следующие операции: \n\n* `put key value` —– добавление пары ключ-значение. Если заданный ключ уже есть в таблице, то соответствующее ему значение обновляется. \n* `get key` –— получение значения по ключу. Если ключа нет в таблице, то вывести «None». Иначе вывести найденное значение. \n* `delete key` –— удаление ключа из таблицы. Если такого ключа нет, то вывести «None», иначе вывести хранимое по данному ключу значение и удалить ключ.\n\nВ таблице хранятся уникальные ключи.\n\nТребования к реализации: \n\n* Нельзя использовать имеющиеся в языках программирования реализации хеш-таблиц \n(std::unordered_map в С++, dict в Python, HashMap в Java, и т. д.)\n* Число хранимых в таблице ключей не превосходит 10^5.\n* Разрешать коллизии следует с помощью метода цепочек или с помощью открытой адресации.\n* Все операции должны выполняться за O(1) в среднем.\n* Поддерживать рехеширование и масштабирование хеш-таблицы не требуется.\n* Ключи и значения, id сотрудников и их зарплата, —– целые числа. Поддерживать произвольные хешируемые типы не требуется.\n\n#### Формат ввода\nВ первой строке задано общее число запросов к таблице n (1≤ n≤ 106).\n\nВ следующих n строках записаны запросы, которые бывают трех видов –— `get`, `put`, `delete` \n—– как описано в условии.\n\nВсе ключи и значения –— целые неотрицательные числа, не превосходящие 10^9.\n\n#### Формат вывода\nНа каждый запрос вида `get` и `delete` выведите ответ на него в отдельной строке.\n\n\n#### Пример\n\u003ctable\u003e\u003ctbody\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003cb\u003eВвод\u003c/b\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003cb\u003eВывод\u003c/b\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd valign=\"top\"\u003e\n10\u003cbr\u003e\nget 1\u003cbr\u003e\nput 1 10\u003cbr\u003e\nput 2 4\u003cbr\u003e\nget 1\u003cbr\u003e\nget 2\u003cbr\u003e\ndelete 2\u003cbr\u003e\nget 2\u003cbr\u003e\nput 1 5\u003cbr\u003e\nget 1\u003cbr\u003e\ndelete 2\u003cbr\u003e\n\n\u003c/td\u003e\n    \u003ctd valign=\"top\"\u003e\nNone\u003cbr\u003e\n10\u003cbr\u003e\n4\u003cbr\u003e\n4\u003cbr\u003e\nNone\u003cbr\u003e\n5\u003cbr\u003e\nNone\u003cbr\u003e\n\n\u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/tbody\u003e\u003c/table\u003e\n\n\u003c/details\u003e\n\n---\n\n## 5. Деревья\n\n[contest.yandex.ru](https://contest.yandex.ru/contest/24809/problems/)\n\n---\n\n\u003cdetails\u003e\n\u003csummary\u003e\n\u003cb\u003eСбалансированное дерево (\u003ca href=\"sprint_5/balanced_tree.py\"\u003ebalanced_tree.py\u003c/a\u003e)\u003c/b\u003e\n\u003c/summary\u003e\n\n#### Условие\nГоше очень понравилось слушать рассказ Тимофея про деревья. \nОсобенно часть про сбалансированные деревья. \nОн решил написать функцию, которая определяет, сбалансировано ли дерево.\nДерево считается сбалансированным, \nесли левое и правое поддеревья каждой вершины отличаются по высоте не больше, чем на единицу.\n\n#### Формат ввода\nНа вход подается корень дерева.\n\n#### Формат вывода\nФункция должна вернуть максимальное значение яркости в узле дерева.\n\n\u003c/details\u003e\n\n---\n\n\u003cdetails\u003e\n\u003csummary\u003e\n\u003cb\u003eЛампочки (\u003ca href=\"sprint_5/lamps.py\"\u003elamps.py\u003c/a\u003e)\u003c/b\u003e\n\u003c/summary\u003e\n\n#### Условие\nГоша повесил на стену гирлянду в виде бинарного дерева, \nв узлах которого находятся лампочки. У каждой лампочки есть своя яркость. \nУровень яркости лампочки соответствует числу, расположенному в узле дерева. \nПомогите Гоше найти самую яркую лампочку в гирлянде, то есть такую, у которой яркость наибольшая.\n\n#### Формат ввода\nНа вход подается корень дерева.\n\n#### Формат вывода\nФункция должна вернуть True, если дерево сбалансировано в соответствии с критерием из условия, иначе - False.\n\n\u003c/details\u003e\n\n---\n\n\u003cdetails\u003e\n\u003csummary\u003e\n\u003cb\u003eДерево - анаграмма (\u003ca href=\"sprint_5/anagram.py\"\u003eanagram.py\u003c/a\u003e)\u003c/b\u003e\n\u003c/summary\u003e\n\n#### Условие\nГоша и Алла играют в игру «Удивительные деревья». \nПомогите ребятам определить, является ли дерево, которое им встретилось, деревом-анаграммой?\nДерево называется анаграммой, если оно симметрично относительно своего центра\n\n#### Формат ввода\nНа вход подается корень дерева.\n\n#### Формат вывода\nФункция должна вернуть True если дерево является анаграммой. Иначе - False.\n\n\u003c/details\u003e\n\n---\n\n\u003cdetails\u003e\n\u003csummary\u003e\n\u003cb\u003eДерево - близнецы (\u003ca href=\"sprint_5/twins.py\"\u003etwins.py\u003c/a\u003e)\u003c/b\u003e\n\u003c/summary\u003e\n\n#### Условие\nГоше на день рождения подарили два дерева. \nТимофей сказал, что они совершенно одинаковые. Но, по мнению Гоши, они отличаются.\nПомогите разрешить этот философский спор!\n\n#### Формат ввода\nНа вход подается корень дерева.\n\n#### Формат вывода\nФункция должна вернуть True если деревья являются близнецами. Иначе - False.\n\n\u003c/details\u003e\n\n---\n\n\u003cdetails\u003e\n\u003csummary\u003e\n\u003cb\u003eДерево поиска (\u003ca href=\"sprint_5/bst.py\"\u003ebst.py\u003c/a\u003e)\u003c/b\u003e\n\u003c/summary\u003e\n\n#### Условие\nГоша понял, что такое дерево поиска, и захотел написать функцию, которая определяет, \nявляется ли заданное дерево деревом поиска. \nЗначения в левом поддереве должны быть строго меньше, в правом —- строго больше значения в узле.\nПомогите Гоше с реализацией этого алгоритма.\n\n#### Формат ввода\nНа вход подается корень дерева.\n\n#### Формат вывода\nФункция должна вернуть True, если дерево является деревом поиска, иначе - False.\n\n\u003c/details\u003e\n\n---\n\n\u003cdetails\u003e\n\u003csummary\u003e\n\u003cb\u003eМаксимальная глубина (\u003ca href=\"sprint_5/max_depth.py\"\u003emax_depth.py\u003c/a\u003e)\u003c/b\u003e\n\u003c/summary\u003e\n\n#### Условие\nАлла хочет побывать на разных островах архипелага Алгосы. Она составила карту. \nКарта представлена в виде дерева: корень обозначает центр архипелага, узлы –— другие острова. \nА листья —– это дальние острова, на которые Алла хочет попасть.\nПомогите Алле определить максимальное число островов, \nчерез которые ей нужно пройти для совершения одной поездки от стартового острова до места назначения, \nвключая начальный и конечный пункты.\n\n#### Формат ввода\nНа вход подается корень дерева.\n\n#### Формат вывода\nФункция должна вернуть число, равное максимальному числу островов в пути (включая начальный и конечный пункты).\n\n\u003c/details\u003e\n\n---\n\n\u003cdetails\u003e\n\u003csummary\u003e\n\u003cb\u003eРазные деревья поиска (\u003ca href=\"sprint_5/number_bst.py\"\u003enumber_bst.py\u003c/a\u003e)\u003c/b\u003e\n\u003c/summary\u003e\n\n#### Условие\nРебятам стало интересно, сколько может быть различных деревьев поиска, \nсодержащих в своих узлах все уникальные числа от 1 до n. \nПомогите им найти ответ на этот вопрос.\n\n#### Формат ввода\nВ единственной строке задано число n. Оно не превосходит 20.\n\n#### Формат вывода\nНужно вывести число, равное количеству различных деревьев поиска, \nв узлах которых могут быть размещены числа от 1 до n включительно.\n\n\u003c/details\u003e\n\n---\n\n\u003cdetails\u003e\n\u003csummary\u003e\n\u003cb\u003eПирамидальная сортировка (\u003ca href=\"sprint_5/heap_sort.py\"\u003eheap_sort.py\u003c/a\u003e)\u003c/b\u003e\n\u003c/summary\u003e\n\n#### Условие\n**В данной задаче необходимо реализовать сортировку кучей. \nПри этом кучу необходимо реализовать самостоятельно, использовать имеющиеся в языке реализации нельзя. \nСначала рекомендуется решить задачи про просеивание вниз и вверх.**\n\nТимофей решил организовать соревнование по спортивному программированию, \nчтобы найти талантливых стажёров. \nЗадачи подобраны, участники зарегистрированы, тесты написаны. \nОсталось придумать, как в конце соревнования будет определяться победитель.\n\n\nКаждый участник имеет уникальный логин. \nКогда соревнование закончится, к нему будут привязаны два показателя: \nколичество решённых задач P_i и размер штрафа F_i. \nШтраф начисляется за неудачные попытки и время, затраченное на задачу.\n\n\nТимофей решил сортировать таблицу результатов следующим образом: \nпри сравнении двух участников выше будет идти тот, у которого решено больше задач. \nПри равенстве числа решённых задач первым идёт участник с меньшим штрафом. \nЕсли же и штрафы совпадают, то первым будет тот, \nу которого логин идёт раньше в алфавитном (лексикографическом) порядке.\n\n\nТимофей заказал толстовки для победителей и накануне поехал за ними в магазин. \nВ своё отсутствие он поручил вам реализовать алгоритм быстрой сортировки (англ. quick sort) для таблицы результатов. Так как Тимофей любит спортивное программирование и не любит зря расходовать оперативную память, то ваша реализация сортировки не может потреблять O(n) дополнительной памяти для промежуточных данных (такая модификация быстрой сортировки называется \"in-place\").\n\n\n**Как работает in-place quick sort**\n\nКак и в случае обычной быстрой сортировки, которая использует дополнительную память, \nнеобходимо выбрать опорный элемент (англ. pivot), а затем переупорядочить массив.\nСделаем так, чтобы сначала шли элементы, не превосходящие опорного, а затем —– большие опорного.\n\n\nЗатем сортировка вызывается рекурсивно для двух полученных частей. \nИменно на этапе разделения элементов на группы в обычном алгоритме используется дополнительная память. \nТеперь разберёмся, как реализовать этот шаг in-place.\n\nПусть мы как-то выбрали опорный элемент. Заведём два указателя left и right, \nкоторые изначально будут указывать на левый и правый концы отрезка соответственно. \nЗатем будем двигать левый указатель вправо до тех пор, пока он указывает на элемент, \nменьший опорного. Аналогично двигаем правый указатель влево, пока он стоит на элементе,\nпревосходящем опорный. \nВ итоге окажется, что левее от left все элементы точно принадлежат первой группе, \nа правее от right — второй. Элементы, на которых стоят указатели, нарушают порядок. \nПоменяем их местами (в большинстве языков программирования используется функция swap()) \nи продвинем указатели на следующие элементы. \nБудем повторять это действие до тех пор, пока left и right не столкнутся.\n\n#### Формат ввода\nВ первой строке задано число участников n, 1 ≤ n ≤ 100 000.\nВ каждой из следующих n строк задана информация про одного из участников.\ni-й участник описывается тремя параметрами:\n\n* уникальным логином (строкой из маленьких латинских букв длиной не более 20)\n* числом решённых задач P_i\n* штрафом Fi\n\nFi и Pi — целые числа, лежащие в диапазоне от 0 до 10^9.\n\n#### Формат вывода\nДля отсортированного списка участников выведите по порядку их логины по одному в строке.\n\n#### Пример\n\u003ctable\u003e\u003ctbody\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003cb\u003eВвод\u003c/b\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003cb\u003eВывод\u003c/b\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd valign=\"top\"\u003e\n5\u003cbr\u003e\nalla 4 100\u003cbr\u003e\ngena 6 1000\u003cbr\u003e\ngosha 2 90\u003cbr\u003e\nrita 2 90\u003cbr\u003e\ntimofey 4 80\u003cbr\u003e\n\n\u003c/td\u003e\n    \u003ctd valign=\"top\"\u003e\ngena\u003cbr\u003e\ntimofey\u003cbr\u003e\nalla\u003cbr\u003e\ngosha\u003cbr\u003e\nrita\u003cbr\u003e\n\n\u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/tbody\u003e\u003c/table\u003e\n\n\u003c/details\u003e\n\n---\n\n\u003cdetails\u003e\n\u003csummary\u003e\n\u003cb\u003eУдали узел (\u003ca href=\"sprint_5/remove_node.py\"\u003eremove_node.py\u003c/a\u003e)\u003c/b\u003e\n\u003c/summary\u003e\n\n#### Условие\nДано бинарное дерево поиска, в котором хранятся ключи. Ключи — уникальные целые числа. \nНайдите вершину с заданным ключом и удалите её из дерева так, чтобы дерево осталось корректным бинарным деревом поиска. \nЕсли ключа в дереве нет, то изменять дерево не надо.\nНа вход вашей функции подаётся корень дерева и ключ, который надо удалить. \nФункция должна вернуть корень изменённого дерева. \nСложность удаления узла должна составлять O(h), где h –— высота дерева.\nСоздавать новые вершины (вдруг очень захочется) нельзя.\n\n#### Формат ввода\nКлючи дерева – натуральные числа. \nВ итоговом решении не надо определять свою структуру/свой класс, описывающий вершину дерева.\n\n\n\u003c/details\u003e\n\n---\n\n## 6. Графы\n\n[contest.yandex.ru](https://contest.yandex.ru/contest/25069/problems/)\n\n---\n\n\u003cdetails\u003e\n\u003csummary\u003e\n\u003cb\u003eПостроить список смежности (\u003ca href=\"sprint_6/adjacency_list.py\"\u003eadjacency_list.py\u003c/a\u003e)\u003c/b\u003e\n\u003c/summary\u003e\n\n#### Условие\nАлла пошла на стажировку в студию графического дизайна, где ей дали такое задание: \nдля очень большого числа ориентированных графов преобразовать их список рёбер в список смежности. \nЧтобы побыстрее решить эту задачу, она решила автоматизировать процесс.\n\nПомогите Алле написать программу, которая по списку рёбер графа будет строить его список смежности.\n\n#### Формат ввода\nВ первой строке дано число вершин n (1 ≤ n ≤ 100) и число ребер m (1 ≤ m ≤ n(n-1)). \nВ следующих m строках заданы ребра в виде пар вершин (u,v), если ребро ведет от u к v.\n\n#### Формат вывода\nВыведите информацию о рёбрах, исходящих из каждой вершины.\n\nВ строке i надо написать число рёбер, исходящих из вершины i, а затем перечислить вершины, \nв которые ведут эти рёбра –— в порядке возрастания их номеров.\n\n#### Пример\n\u003ctable\u003e\u003ctbody\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003cb\u003eВвод\u003c/b\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003cb\u003eВывод\u003c/b\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd valign=\"top\"\u003e\n5 3\u003cbr\u003e\n1 3\u003cbr\u003e\n2 3\u003cbr\u003e\n5 2\u003cbr\u003e\n\n\u003c/td\u003e\n    \u003ctd valign=\"top\"\u003e\n1 3\u003cbr\u003e\n1 3\u003cbr\u003e\n0\u003cbr\u003e \n0\u003cbr\u003e\n1 2\u003cbr\u003e\n\n\u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/tbody\u003e\u003c/table\u003e\n\n\u003c/details\u003e\n\n---\n\n\u003cdetails\u003e\n\u003csummary\u003e\n\u003cb\u003eПеревести список ребер в матрицу смежности (\u003ca href=\"sprint_6/adjacency_matrix.py\"\u003eadjacency_matrix.py\u003c/a\u003e)\u003c/b\u003e\n\u003c/summary\u003e\n\n#### Условие\nАлла успешно справилась с предыдущим заданием, и теперь ей дали новое. \nНа этот раз список рёбер ориентированного графа надо переводить в матрицу смежности. \nКонечно же, Алла попросила вас помочь написать программу для этого.\n\n#### Формат ввода\nВ первой строке дано число вершин n (1 ≤ n ≤ 100) и число ребер m (1 ≤ m ≤ n(n-1)). \nВ следующих m строках заданы ребра в виде пар вершин (u,v), если ребро ведет от u к v.\n\n#### Формат вывода\nВыведите матрицу смежности n на n. \nНа пересечении i-й строки и j-го столбца стоит единица, если есть ребро, ведущее из i в j.\n\n#### Пример\n\u003ctable\u003e\u003ctbody\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003cb\u003eВвод\u003c/b\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003cb\u003eВывод\u003c/b\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd valign=\"top\"\u003e\n5 3\u003cbr\u003e\n1 3\u003cbr\u003e\n2 3\u003cbr\u003e\n5 2\u003cbr\u003e\n\n\u003c/td\u003e\n    \u003ctd valign=\"top\"\u003e\n0 0 1 0 0\u003cbr\u003e\n0 0 1 0 0\u003cbr\u003e \n0 0 0 0 0\u003cbr\u003e \n0 0 0 0 0\u003cbr\u003e \n0 1 0 0 0\u003cbr\u003e\n\n\u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/tbody\u003e\u003c/table\u003e\n\n\u003c/details\u003e\n\n---\n\n\u003cdetails\u003e\n\u003csummary\u003e\n\u003cb\u003eDFS (\u003ca href=\"sprint_6/dfs.py\"\u003edfs.py\u003c/a\u003e)\u003c/b\u003e\n\u003c/summary\u003e\n\n#### Условие\nЗадан неориентированный граф. \nОбойдите с помощью DFS все вершины, достижимые из заданной вершины s, и выведите их в порядке обхода, \nесли начинать обход из s.\n\n#### Формат ввода\nВ первой строке дано количество вершин n (1 ≤ n ≤ 105) и рёбер m (0 ≤ m ≤ 105). \nДалее в m строках описаны рёбра графа. Каждое ребро описывается номерами двух вершин u и v (1 ≤ u, v ≤ n). \nВ последней строке дан номер стартовой вершины s (1 ≤ s ≤ n). В графе нет петель и кратных рёбер.\n\n#### Формат вывода\nВыведите вершины в порядке обхода, \nсчитая что при запуске от каждой конкретной вершины её соседи будут рассматриваться в порядке возрастания \n(то есть если вершина 2 соединена с 1 и 3, то сначала обход пойдёт в 1, а уже потом в 3).\n\n#### Пример\n\u003ctable\u003e\u003ctbody\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003cb\u003eВвод\u003c/b\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003cb\u003eВывод\u003c/b\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd valign=\"top\"\u003e\n4 4\u003cbr\u003e\n3 2\u003cbr\u003e\n4 3\u003cbr\u003e\n1 4\u003cbr\u003e\n1 2\u003cbr\u003e\n3\u003cbr\u003e\n\n\u003c/td\u003e\n    \u003ctd valign=\"top\"\u003e\n3 2 1 4\u003cbr\u003e\n\n\u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/tbody\u003e\u003c/table\u003e\n\n\u003c/details\u003e\n\n---\n\n\u003cdetails\u003e\n\u003csummary\u003e\n\u003cb\u003eBFS (\u003ca href=\"sprint_6/bfs.py\"\u003ebfs.py\u003c/a\u003e)\u003c/b\u003e\n\u003c/summary\u003e\n\n#### Условие\nЗадан неориентированный граф. \nОбойдите с помощью BFS все вершины, достижимые из заданной вершины s, и выведите их в порядке обхода, \nесли начинать обход из s.\n\n#### Формат ввода\nВ первой строке дано количество вершин n (1 ≤ n ≤ 105) и рёбер m (0 ≤ m ≤ 105). \nДалее в m строках описаны рёбра графа. Каждое ребро описывается номерами двух вершин u и v (1 ≤ u, v ≤ n). \nВ последней строке дан номер стартовой вершины s (1 ≤ s ≤ n). В графе нет петель и кратных рёбер.\n\n#### Формат вывода\nВыведите вершины в порядке обхода, \nсчитая что при запуске от каждой конкретной вершины её соседи будут рассматриваться в порядке возрастания \n(то есть если вершина 2 соединена с 1 и 3, то сначала обход пойдёт в 1, а уже потом в 3).\n\n#### Пример\n\u003ctable\u003e\u003ctbody\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003cb\u003eВвод\u003c/b\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003cb\u003eВывод\u003c/b\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd valign=\"top\"\u003e\n4 4\u003cbr\u003e\n3 2\u003cbr\u003e\n4 3\u003cbr\u003e\n1 4\u003cbr\u003e\n1 2\u003cbr\u003e\n3\u003cbr\u003e\n\n\u003c/td\u003e\n    \u003ctd valign=\"top\"\u003e\n3 2 4 1\u003cbr\u003e\n\n\u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/tbody\u003e\u003c/table\u003e\n\n\u003c/details\u003e\n\n---\n\n\u003cdetails\u003e\n\u003csummary\u003e\n\u003cb\u003eКомпоненты связности (\u003ca href=\"sprint_6/connectivity.py\"\u003econnectivity.py\u003c/a\u003e)\u003c/b\u003e\n\u003c/summary\u003e\n\n#### Условие\nВам дан неориентированный граф. Найдите его компоненты связности.\n\n#### Формат ввода\nВ первой строке дано количество вершин n (1 ≤ n ≤ 105) и рёбер m (0 ≤ m ≤ 105). \nДалее в m строках описаны рёбра графа. Каждое ребро описывается номерами двух вершин u и v (1 ≤ u, v ≤ n). \nВ последней строке дан номер стартовой вершины s (1 ≤ s ≤ n). В графе нет петель и кратных рёбер.\n\n#### Формат вывода\nВыведите все компоненты связности в следующем формате: в первой строке выведите общее количество компонент.\n\nЗатем на отдельных строках выведите вершины каждой компоненты, отсортированные по возрастанию номеров. \nКомпоненты между собой упорядочивайте по номеру первой вершины.\n\n#### Пример\n\u003ctable\u003e\u003ctbody\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003cb\u003eВвод\u003c/b\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003cb\u003eВывод\u003c/b\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd valign=\"top\"\u003e\n6 3\u003cbr\u003e\n1 2\u003cbr\u003e\n6 5\u003cbr\u003e\n2 3\u003cbr\u003e\n\n\u003c/td\u003e\n    \u003ctd valign=\"top\"\u003e\n3\u003cbr\u003e\n1 2 3\u003cbr\u003e\n4\u003cbr\u003e\n5 6\u003cbr\u003e\n\n\u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/tbody\u003e\u003c/table\u003e\n\n\u003c/details\u003e\n\n---\n\n\u003cdetails\u003e\n\u003csummary\u003e\n\u003cb\u003eКомпоненты связности (\u003ca href=\"sprint_6/attractions.py\"\u003eattractions.py\u003c/a\u003e)\u003c/b\u003e\n\u003c/summary\u003e\n\n#### Условие\nВы приехали на архипелаг Алгосы (наконец-то!). Здесь есть n достопримечательностей. \nВаша лодка может высадить вас у одной из них, забрать у какой-то другой, \nвозможно, той же самой достопримечательности и увезти на материк.\n\nЧтобы более тщательно спланировать свой маршрут, \nвы хотите узнать расстояния между каждой парой достопримечательностей Алгосов. \nНекоторые из них соединены мостами, по которым вы можете передвигаться в любую сторону. \nВсего мостов m.\n\nЕсть вероятность, что карта архипелага устроена так, \nчто нельзя добраться от какой-то одной достопримечательности до другой без использования лодки.\n\nНайдите кратчайшие расстояния между всеми парами достопримечательностей.\n\n#### Формат ввода\nВ первой строке даны числа n (1 ≤ n ≤ 100) и m (0 ≤ m ≤ n (n-1)/2). \nВ следующих m строках описаны мосты. \nКаждый мост задаётся номерами двух достопримечательностей 1 ≤ u, v ≤ n и длиной дороги 1 ≤ L ≤ 103.\n\n#### Формат вывода\nВыведите матрицу n × n кратчайших расстояний. \nНа пересечении i-й строки и j-го столбца должно стоять расстояние от i-й до j-й достопримечательности. \nЕсли между какой-то парой нет пути, то в соответствующей клетке поставьте -1.\n\n#### Пример\n\u003ctable\u003e\u003ctbody\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003cb\u003eВвод\u003c/b\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003cb\u003eВывод\u003c/b\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd valign=\"top\"\u003e\n4 4\u003cbr\u003e\n1 2 1\u003cbr\u003e\n2 3 3\u003cbr\u003e\n3 4 5\u003cbr\u003e\n1 4 2\u003cbr\u003e\n\n\u003c/td\u003e\n    \u003ctd valign=\"top\"\u003e\n0 1 4 2\u003cbr\u003e\n1 0 3 3\u003cbr\u003e\n4 3 0 5\u003cbr\u003e \n2 3 5 0\u003cbr\u003e\n\n\u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/tbody\u003e\u003c/table\u003e\n\n\u003c/details\u003e\n\n---\n\n\u003cdetails\u003e\n\u003csummary\u003e\n\u003cb\u003eДорогая сеть (\u003ca href=\"sprint_6/expensive_network.py\"\u003eexpensive_network.py\u003c/a\u003e)\u003c/b\u003e\n\u003c/summary\u003e\n\n#### Условие\nТимофей решил соединить все компьютеры в своей компании в единую сеть. \nДля этого он придумал построить минимальное остовное дерево, чтобы эффективнее использовать ресурсы.\n\nНо от начальства пришла новость о том, что выделенный на сеть бюджет оказался очень большим и его срочно надо израсходовать. \nПоэтому Тимофея теперь интересуют не минимальные, а максимальные остовные деревья.\n\nОн поручил вам найти вес такого максимального остовного дерева в неориентированном графе, который задаёт схему офиса.\n\n#### Формат ввода\nВ первой строке дано количество вершин n и ребер m графа (1 ≤ n ≤ 1000, 0 ≤ m ≤ 100000).\n\nВ каждой из следующих m строк заданы рёбра в виде троек чисел u, v, w. \nu и v — вершины, которые соединяет это ребро. \nw — его вес ( 1 ≤ u, v ≤ n, 0 ≤ w ≤ 10000). \nВ графе могут быть петли и кратные ребра. Граф может оказаться несвязным.\n\n#### Формат вывода\nЕсли максимальное остовное дерево существует, то выведите его вес. \nИначе (если в графе несколько компонент связности) выведите фразу «Oops! I did it again».\n\n#### Пример\n\u003ctable\u003e\u003ctbody\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003cb\u003eВвод\u003c/b\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003cb\u003eВывод\u003c/b\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd valign=\"top\"\u003e\n4 4\u003cbr\u003e\n1 2 5\u003cbr\u003e\n1 3 6\u003cbr\u003e\n2 4 8\u003cbr\u003e\n3 4 3\u003cbr\u003e\n\n\u003c/td\u003e\n    \u003ctd valign=\"top\"\u003e\n19\u003cbr\u003e\n\n\u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/tbody\u003e\u003c/table\u003e\n\n\u003c/details\u003e\n\n---\n\n\u003cdetails\u003e\n\u003csummary\u003e\n\u003cb\u003eЖелезные дороги (\u003ca href=\"sprint_6/railroads.py\"\u003erailroads.py\u003c/a\u003e)\u003c/b\u003e\n\u003c/summary\u003e\n\n#### Условие\nВ стране X есть n городов, которым присвоены номера от 1 до n. Столица страны имеет номер n. \nМежду городами проложены железные дороги.\n\nОднако дороги могут быть двух типов по ширине полотна. \nЛюбой поезд может ездить только по одному типу полотна. Условно один тип дорог помечают как R, а другой как B. \nТо есть если маршрут от одного города до другого имеет как дороги типа R, так и дороги типа B, \nто ни один поезд не сможет по этому маршруту проехать. \n**От одного города до другого можно проехать только по маршруту, \nсостоящему исключительно из дорог типа R или только из дорог типа B.**\n\nНо это ещё не всё. По дорогам страны X можно двигаться только от города с меньшим номером к городу с большим номером. \nЭто объясняет большой приток жителей в столицу, у которой номер n.\n\nКарта железных дорог называется оптимальной, если не существует пары городов A и B такой, \nчто от A до B можно добраться как по дорогам типа R, так и по дорогам типа B. \nИными словами, для любой пары городов верно, что от города с меньшим номером до города с бОльшим номером \nможно добраться по дорогам только какого-то одного типа или же что маршрут построить вообще нельзя. \nВыясните, является ли данная вам карта оптимальной.\n\n#### Формат ввода\nВ первой строке дано число n (1 ≤ n ≤ 5000) — количество городов в стране. \nДалее задана карта железных дорог в следующей формате.\n\nКарта задана n-1 строкой. В i-й строке описаны дороги из города i в города i+1, i+2, ..., n. \nВ строке записано n - i символов, каждый из которых либо R, либо B. \nЕсли j-й символ строки i равен «B», то из города i в город i + j идет дорога типа «B». Аналогично для типа «R».\n\n#### Формат вывода\nВыведите «YES», если карта оптимальна, и «NO» в противном случае.\n\n#### Пример\n\u003ctable\u003e\u003ctbody\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003cb\u003eВвод\u003c/b\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003cb\u003eВывод\u003c/b\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd valign=\"top\"\u003e\n3\u003cbr\u003e\nRB\u003cbr\u003e\nR\u003cbr\u003e\n\n\u003c/td\u003e\n    \u003ctd valign=\"top\"\u003e\nNO\u003cbr\u003e\n\n\u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/tbody\u003e\u003c/table\u003e\n\n\u003c/details\u003e\n\n---\n\n## 7. Жадные алгоритмы и динамическое программирование\n\n[contest.yandex.ru](https://contest.yandex.ru/contest/25596/problems/)\n\n---\n\n\u003cdetails\u003e\n\u003csummary\u003e\n\u003cb\u003eБиржа (\u003ca href=\"sprint_7/exchange.go\"\u003eexchange.go\u003c/a\u003e)\u003c/b\u003e\n\u003c/summary\u003e\n\n#### Условие\nРита хочет попробовать поиграть на бирже. Но для начала она решила потренироваться на исторических данных.\n\nДаны стоимости акций в каждый из n дней. В течение дня цена акции не меняется. \nАкции можно покупать и продавать, но только по одной штуке в день. \nВ один день нельзя совершать более одной операции (покупки или продажи). \nТакже на руках не может быть более одной акции в каждый момент времени.\n\nПомогите Рите выяснить, какую максимальную прибыль она могла бы получить.\n\n#### Формат ввода\nВ первой строке записано количество дней n —– целое число в диапазоне от 0 до 10 000.\n\nВо второй строке через пробел записано n целых чисел в диапазоне от 0 до 1000 –— цены акций.\n\n#### Формат вывода\nВыведите число, равное максимально возможной прибыли за эти дни.\n\n#### Пример\n\u003ctable\u003e\u003ctbody\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003cb\u003eВвод\u003c/b\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003cb\u003eВывод\u003c/b\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd valign=\"top\"\u003e\n6\u003cbr\u003e\n7 1 5 3 6 4\u003cbr\u003e\n\n\u003c/td\u003e\n    \u003ctd valign=\"top\"\u003e\n7\u003cbr\u003e\n\n\u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/tbody\u003e\u003c/table\u003e\n\n\u003c/details\u003e\n\n---\n\n\u003cdetails\u003e\n\u003csummary\u003e\n\u003cb\u003eРасписание (\u003ca href=\"sprint_7/schedule.go\"\u003eschedule.go\u003c/a\u003e)\u003c/b\u003e\n\u003c/summary\u003e\n\n#### Условие\nДано количество учебных занятий, проходящих в одной аудитории. \nДля каждого из них указано время начала и конца. \nНужно составить расписание, \nв соответствии с которым в классе можно будет провести как можно больше занятий.\n\nЕсли возможно несколько оптимальных вариантов, то выведите любой. \nВозможно одновременное проведение более чем одного занятия нулевой длительности.\n\n#### Формат ввода\nВ первой строке задано число занятий. \nОно не превосходит 1000. \nДалее для каждого занятия в отдельной строке записано время начала и конца, разделённые пробелом. \nВремя задаётся одним целым числом h, если урок начинается/заканчивается ровно в h часов. \nЕсли же урок начинается/заканчивается в h часов m минут, то время записывается как h.m. \nГарантируется, что каждое занятие начинается не позже, чем заканчивается. \nУказываются только значащие цифры.\n\n#### Формат вывода\nВыведите в первой строке наибольшее число уроков, которое можно провести в аудитории. \nДалее выведите время начала и конца каждого урока в отдельной строке в порядке их проведения.\n\n#### Пример\n\u003ctable\u003e\u003ctbody\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003cb\u003eВвод\u003c/b\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003cb\u003eВывод\u003c/b\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd valign=\"top\"\u003e\n5\u003cbr\u003e\n9 10\u003cbr\u003e\n9.3 10.3\u003cbr\u003e\n10 11\u003cbr\u003e\n10.3 11.3\u003cbr\u003e\n11 12\u003cbr\u003e\n\n\u003c/td\u003e\n    \u003ctd valign=\"top\"\u003e\n3\u003cbr\u003e\n9 10\u003cbr\u003e\n10 11\u003cbr\u003e\n11 12\u003cbr\u003e\n\n\u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/tbody\u003e\u003c/table\u003e\n\n\u003c/details\u003e\n\n---\n\n\u003cdetails\u003e\n\u003csummary\u003e\n\u003cb\u003eЗолотая лихорадка (\u003ca href=\"sprint_7/fever.go\"\u003efever.go\u003c/a\u003e)\u003c/b\u003e\n\u003c/summary\u003e\n\n#### Условие\nГуляя по одному из островов Алгосского архипелага, \nГоша набрёл на пещеру, в которой лежат кучи золотого песка. \nК счастью, у Гоши есть с собой рюкзак грузоподъёмностью до M килограмм, \nпоэтому он может унести с собой какое-то ограниченное количество золота.\n\nВсего золотых куч n штук, и все они разные. \nВ куче под номером i содержится mi килограммов золотого песка, \nа стоимость одного килограмма — ci алгосских франков.\n\nПомогите Гоше наполнить рюкзак так, \nчтобы общая стоимость золотого песка в пересчёте на алгосские франки была максимальной.\n\n#### Формат ввода\nВ первой строке задано целое число M — грузоподъёмность рюкзака Гоши (0 ≤ M ≤ 108).\nВо второй строке дано количество куч с золотым песком — целое число n (1 ≤ n ≤ 105).\n\nВ каждой из следующих n строк описаны кучи: i-ая куча задаётся двумя целыми числами ci и mi, записанными через пробел (1 ≤ ci ≤ 107, 1 ≤ mi ≤ 108).\n\n#### Формат вывода\nВыведите единственное число —– максимальную сумму (в алгосских франках), \nкоторую Гоша сможет вынести из пещеры в своём рюкзаке.\n\n\n#### Пример\n\u003ctable\u003e\u003ctbody\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003cb\u003eВвод\u003c/b\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003cb\u003eВывод\u003c/b\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd valign=\"top\"\u003e\n10\u003cbr\u003e\n3\u003cbr\u003e\n8 1\u003cbr\u003e\n2 10\u003cbr\u003e\n4 5\u003cbr\u003e\n\n\u003c/td\u003e\n    \u003ctd valign=\"top\"\u003e\n36\u003cbr\u003e\n\n\u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/tbody\u003e\u003c/table\u003e\n\n\u003c/details\u003e\n\n---\n\n\u003cdetails\u003e\n\u003csummary\u003e\n\u003cb\u003eЧисла Фибоначчи для взрослых (\u003ca href=\"sprint_7/fibonacci.go\"\u003efibonacci.go\u003c/a\u003e)\u003c/b\u003e\n\u003c/summary\u003e\n\n#### Условие\nГоша практикуется в динамическом программировании — он хочет быстро считать числа Фибоначчи.\n\n#### Формат ввода\nВ единственной строке дано целое число n (0 ≤ n ≤ 106).\n\n#### Формат вывода\nВычислите значение Fn по модулю 10^9 + 7 и выведите его.\n\n#### Пример\n\u003ctable\u003e\u003ctbody\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003cb\u003eВвод\u003c/b\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003cb\u003eВывод\u003c/b\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd valign=\"top\"\u003e\n5\u003cbr\u003e\n\n\u003c/td\u003e\n    \u003ctd valign=\"top\"\u003e\n8\u003cbr\u003e\n\n\u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/tbody\u003e\u003c/table\u003e\n\n\u003c/details\u003e\n\n---\n\n\u003cdetails\u003e\n\u003csummary\u003e\n\u003cb\u003eПрыжки по лестнице (\u003ca href=\"sprint_7/jumps.go\"\u003ejumps.go\u003c/a\u003e)\u003c/b\u003e\n\u003c/summary\u003e\n\n#### Условие\nАлла хочет доказать, что она умеет прыгать вверх по лестнице быстрее всех. \nНа этот раз соревнования будут проходить на специальной прыгательной лестнице. \nС каждой её ступеньки можно прыгнуть вверх на любое расстояние от 1 до k. \nЧисло k придумывает Алла.\n\nГоша не хочет проиграть, поэтому просит вас посчитать количество способов допрыгать от первой ступеньки до n-й. \nИзначально все стоят на первой ступеньке.\n\n#### Формат ввода\nВ единственной строке даны два числа — n и k (1 ≤ n ≤ 1000, 1 ≤ k ≤ n).\n\n#### Формат вывода\nВыведите количество способов по модулю 10^9 + 7.\n\n#### Пример\n\u003ctable\u003e\u003ctbody\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003cb\u003eВвод\u003c/b\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003cb\u003eВывод\u003c/b\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd valign=\"top\"\u003e\n6 3\u003cbr\u003e\n\n\u003c/td\u003e\n    \u003ctd valign=\"top\"\u003e\n13\u003cbr\u003e\n\n\u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/tbody\u003e\u003c/table\u003e\n\n\u003c/details\u003e\n\n---\n\n\u003cdetails\u003e\n\u003csummary\u003e\n\u003cb\u003eБанкомат (\u003ca href=\"sprint_7/atm.go\"\u003eatm.go\u003c/a\u003e)\u003c/b\u003e\n\u003c/summary\u003e\n\n#### Условие\nТимофей пошёл снять деньги в банкомат. Ему нужно m франков. \nВ банкомате в бесконечном количестве имеются купюры различных достоинств. \nВсего различных достоинств n. Купюр каждого достоинства можно взять бесконечно много. \nНужно определить число способов, которыми Тимофей сможет набрать нужную сумму.\n\n#### Формат ввода\nВ первой строке записано целое число m — сумма, которую нужно набрать. \nВо второй строке n — количество монет в банкомате. \nОба числа не превосходят 300. \nДалее в третьей строке записано n уникальных натуральных чисел, каждое в диапазоне от 1 до 1000 –– достоинства купюр.\n\n#### Формат вывода\nНужно вывести число способов, которым Тимофей сможет набрать нужную сумму.\n\n#### Пример\n\u003ctable\u003e\u003ctbody\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003cb\u003eВвод\u003c/b\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003cb\u003eВывод\u003c/b\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd valign=\"top\"\u003e\n5\u003cbr\u003e\n3\u003cbr\u003e\n3 2 1\u003cbr\u003e\n\n\u003c/td\u003e\n    \u003ctd valign=\"top\"\u003e\n5\u003cbr\u003e\n\n\u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/tbody\u003e\u003c/table\u003e\n\n\u003c/details\u003e\n\n---\n\n\u003cdetails\u003e\n\u003csummary\u003e\n\u003cb\u003eРасстояние по Левенштейну (\u003ca href=\"sprint_7/levenshtein_distance.py\"\u003elevenshtein_distance.py\u003c/a\u003e)\u003c/b\u003e\n\u003c/summary\u003e\n\n#### Условие\nРасстоянием Левенштейна между двумя строками s и t называется количество атомарных изменений, \nс помощью которых можно одну строку превратить в другую. \nПод атомарными изменениями подразумеваются: \nудаление одного символа, вставка одного символа, замена одного символа на другой.\n\nНайдите расстояние Левенштейна для предложенной пары строк.\n\nВыведите единственное число — расстояние между строками.\n\n#### Формат ввода\nВ первой строке дана строка s, во второй — строка t. \nДлины обеих строк не превосходят 1000. \nСтроки состоят из маленьких латинских букв.\n\n#### Формат вывода\nВыведите единственное число — расстояние между строками.\n\n#### Пример\n\u003ctable\u003e\u003ctbody\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003cb\u003eВвод\u003c/b\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003cb\u003eВывод\u003c/b\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd valign=\"top\"\u003e\nabacaba\u003cbr\u003e\nabaabc\u003cbr\u003e\n\n\u003c/td\u003e\n    \u003ctd valign=\"top\"\u003e\n2\u003cbr\u003e\n\n\u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/tbody\u003e\u003c/table\u003e\n\n\u003c/details\u003e\n\n---\n\n\u003cdetails\u003e\n\u003csummary\u003e\n\u003cb\u003eОдинаковые суммы (\u003ca href=\"sprint_7/is_same_amounts.py\"\u003eis_same_amounts.py\u003c/a\u003e)\u003c/b\u003e\n\u003c/summary\u003e\n\n#### Условие\nНа Алгосах устроили турнир по настольному теннису. \nГоша выиграл n партий, получив при этом некоторое количество очков за каждую из них.\n\nГоше стало интересно, можно ли разбить все заработанные им во время турнира очки на две части так, \nчтобы сумма в них была одинаковой.\n\n#### Формат ввода\nВ первой строке записано целое число n (0 ≤ n ≤ 300) –— количество выигранных партий.\n\nВо второй строке через пробел записано n целых неотрицательных чисел, \nкаждое из которых не превосходит 300 –— заработанные в партиях очки.\n\n#### Формат вывода\nНужно вывести True, если произвести такое разбиение возможно, иначе —– False\n\n#### Пример\n\u003ctable\u003e\u003ctbody\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003cb\u003eВвод\u003c/b\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003cb\u003eВывод\u003c/b\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd valign=\"top\"\u003e\n4\u003cbr\u003e\n1 5 7 1\u003cbr\u003e\n\n\u003c/td\u003e\n    \u003ctd valign=\"top\"\u003e\nTrue\u003cbr\u003e\n\n\u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/tbody\u003e\u003c/table\u003e\n\n\u003c/details\u003e\n\n---\n\n## 8. Алгоритмы на строках\n\n[contest.yandex.ru](https://contest.yandex.ru/contest/26131/problems/)\n\n---\n\n\u003cdetails\u003e\n\u003csummary\u003e\n\u003cb\u003eРазворот строки (\u003ca href=\"sprint_8/reversal_string.go\"\u003ereversal_string.go\u003c/a\u003e)\u003c/b\u003e\n\u003c/summary\u003e\n\n#### Условие\nВ некоторых языках предложения пишутся и читаются не слева направо, а справа налево.\n\nВам под руку попался странный текст –— в нём обычный (слева направо) порядок букв в словах. \nА вот сами слова идут в противоположном направлении. \nВам надо преобразовать текст так, чтобы слова в нём были написаны слева направо.\n\n#### Формат ввода\nНа ввод подаётся строка, состоящая из слов, \nразделённых пробелами (один пробел между соседними словами). \nВсего слов не более 1000, длина каждого из них —– от 1 до 100 символов. \nСлова состоят из строчных букв английского алфавита.\n\n#### Формат вывода\nВыведите строку с обратным порядком слов в ней.\n\n#### Пример\n\u003ctable\u003e\u003ctbody\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003cb\u003eВвод\u003c/b\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003cb\u003eВывод\u003c/b\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd valign=\"top\"\u003e\none two three\u003cbr\u003e\n\n\u003c/td\u003e\n    \u003ctd valign=\"top\"\u003e\nthree two one\u003cbr\u003e\n\n\u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/tbody\u003e\u003c/table\u003e\n\n\u003c/details\u003e\n\n---\n\n\u003cdetails\u003e\n\u003csummary\u003e\n\u003cb\u003eСамый длинный палиндром (\u003ca href=\"sprint_8/longest_palindrome.go\"\u003elongest_palindrome.go\u003c/a\u003e)\u003c/b\u003e\n\u003c/summary\u003e\n\n#### Условие\nПалиндром —– это строка, которая одинаково читается как слева направо, так и справа налево.\n\nИз данной строки s путём удаления и перестановки букв надо получить палиндром максимальной длины. \nСреди всех таких палиндромов надо получить лексикографически минимальный. \nКоличество удалений и перестановок символов может быть любым.\n\n#### Формат ввода\nВ единственной строке дана строка s. \nДлина строки |s| ≤ 105. \nСтрока состоит из строчных букв английского алфавита.\n\n#### Формат вывода\nВыведите полученный палиндром. Заметьте, что ответ определяется однозначно.\n\n#### Пример\n\u003ctable\u003e\u003ctbody\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003cb\u003eВвод\u003c/b\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003cb\u003eВывод\u003c/b\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd valign=\"top\"\u003e\naaaabb\u003cbr\u003e\n\n\u003c/td\u003e\n    \u003ctd valign=\"top\"\u003e\naabbaa\u003cbr\u003e\n\n\u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/tbody\u003e\u003c/table\u003e\n\n\u003c/details\u003e\n\n---\n\n\u003cdetails\u003e\n\u003csummary\u003e\n\u003cb\u003eОбщий префикс (\u003ca href=\"sprint_8/general_prefix.go\"\u003egeneral_prefix.go\u003c/a\u003e)\u003c/b\u003e\n\u003c/summary\u003e\n\n#### Условие\nНайдите наибольший по длине общий префикс нескольких строк.\n\n#### Формат ввода\nВ первой строке дано число n (1 ≤ n ≤ 105). Затем по одной на строке даны n строк, каждая не превышает 105 в длину. \nСуммарная длина всех строк не превосходит 107.\n\n#### Формат вывода\nВыведите единственное число — длину наибольшего префикса всех данных строк.\n\n#### Пример\n\u003ctable\u003e\u003ctbody\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003cb\u003eВвод\u003c/b\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003cb\u003eВывод\u003c/b\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd valign=\"top\"\u003e\n3\u003cbr\u003e\nabacaba\u003cbr\u003e\nabudabi\u003cbr\u003e\nabcdefg\u003cbr\u003e\n\n\u003c/td\u003e\n    \u003ctd valign=\"top\"\u003e\n2\u003cbr\u003e\n\n\u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/tbody\u003e\u003c/table\u003e\n\n\u003c/details\u003e\n\n---\n\n\u003cdetails\u003e\n\u003csummary\u003e\n\u003cb\u003eГлобальная замена (\u003ca href=\"sprint_8/global_replace.go\"\u003eglobal_replace.go\u003c/a\u003e)\u003c/b\u003e\n\u003c/summary\u003e\n\n#### Условие\nНапишите программу, которая будет заменять в тексте все вхождения строки s на строку t. \nГарантируется, что никакие два вхождения шаблона s не пересекаются друг с другом.\n\n#### Формат ввода\nВ первой строке дан текст —– это строка из строчных букв английского алфавита, длина которой не превышает 106.\n\nВо второй строке записан шаблон s, вхождения которого будут заменены.\n\nВ третьей строке дана строка t, которая будет заменять вхождения.\n\nОбе строки s и t состоят из строчных букв английского алфавита, длина каждой строки не превосходит 105. \nРазмер итоговой строки не превосходит 2⋅ 106.\n\n#### Формат вывода\nВ единственной строке выведите результат всех замен — текст, в котором все вхождения s заменены на t.\n\n#### Пример\n\u003ctable\u003e\u003ctbody\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003cb\u003eВвод\u003c/b\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003cb\u003eВывод\u003c/b\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd valign=\"top\"\u003e\npingpong\u003cbr\u003e\nng\u003cbr\u003e\nmpi\u003cbr\u003e\n\n\u003c/td\u003e\n    \u003ctd valign=\"top\"\u003e\npimpipompi\u003cbr\u003e\n\n\u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/tbody\u003e\u003c/table\u003e\n\n\u003c/details\u003e\n\n---\n\n\u003cdetails\u003e\n\u003csummary\u003e\n\u003cb\u003ePacked Prefix (\u003ca href=\"sprint_8/packed_prefix.py\"\u003epacked_prefix.py\u003c/a\u003e)\u003c/b\u003e\n\u003c/summary\u003e\n\n#### Условие\nВам даны строки в запакованном виде. Определим запакованную строку (ЗС) рекурсивно. \nСтрока, состоящая только из строчных букв английского алфавита является ЗС. \nЕсли A и B —– корректные ЗС, то и AB является ЗС. \nЕсли A —– ЗС, а n — однозначное натуральное число, то n[A] тоже ЗС. \nПри этом запись n[A] означает, что при распаковке строка A записывается подряд n раз. \nНайдите наибольший общий префикс распакованных строк и выведите его (в распакованном виде).\n\nИными словами, пусть сложение —– это конкатенация двух строк, \nа умножение строки на число — повтор строки соответствующее число раз. \nПусть функция f умеет принимать ЗС и распаковывать её. \nЕсли ЗС D имеет вид D=AB, где A и B тоже ЗС, то f(D) = f(A) + f(B). \nЕсли D=n[A], то f(D) = f(A) × n.\n\n#### Формат ввода\nВ первой строке записано число n (1 ≤ n ≤ 1000) –— число строк.\n\nДалее в n строках записаны запакованные строки. \nГарантируется, что эти строки корректны, то есть удовлетворяют указанному рекурсивному определению. \nДлина строк после распаковки не превосходит 10^5.\n\n#### Формат вывода\nВыведите наибольший общий префикс распакованных строк.\n\n#### Пример\n\u003ctable\u003e\u003ctbody\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003cb\u003eВвод\u003c/b\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003cb\u003eВывод\u003c/b\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd valign=\"top\"\u003e\n3\u003cbr\u003e\n2[a]2[ab]\u003cbr\u003e\n3[a]2[r2[t]]\u003cbr\u003e\na2[aa3[b]]\u003cbr\u003e\n\n\u003c/td\u003e\n    \u003ctd valign=\"top\"\u003e\naaa\u003cbr\u003e\n\n\u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/tbody\u003e\u003c/table\u003e\n\n\u003c/details\u003e\n\n---\n\n\u003cdetails\u003e\n\u003csummary\u003e\n\u003cb\u003eШпаргалка (\u003ca href=\"sprint_8/сheat_sheet.py\"\u003eсheat_sheet.py\u003c/a\u003e)\u003c/b\u003e\n\u003c/summary\u003e\n\n#### Условие\nВася готовится к экзамену по алгоритмам и на всякий случай пишет шпаргалки.\n\nЧтобы уместить на них как можно больше информации, он не разделяет слова пробелами. \nВ итоге получается одна очень длинная строка. \nЧтобы на самом экзамене из-за нервов не запутаться в прочитанном, он просит вас написать программу, \nкоторая по этой длинной строке и набору допустимых слов определит, \nможно ли разбить текст на отдельные слова из набора.\n\nБолее формально: дан текст T и набор строк s1, ... ,sn. \nНадо определить, представим ли T как sk1sk2...skr, \nгде где ki — индексы строк. Индексы могут повторяться. \nСтрока si может встречаться в разбиении текста T произвольное число раз. \nМожно использовать не все строки для разбиения. Строки могут идти в любом порядке.\n\n#### Формат ввода\nВ первой строке дан текст T, который надо разбить на слова. \nДлина T не превосходит 10^5. Текст состоит из строчных букв английского алфавита.\n\nВо второй строке записано число допустимых к использованию слов 1 ≤ n ≤ 100.\n\nВ последующих n строках даны сами слова, состоящие из маленьких латинских букв. \nДлина каждого слова не превосходит 100.\n\n#### Формат вывода\nВыведите «YES», если текст можно разбить на слова из данного словаря, или «NO» в ином случае.\n\n#### Пример\n\u003ctable\u003e\u003ctbody\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003cb\u003eВвод\u003c/b\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003cb\u003eВывод\u003c/b\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd valign=\"top\"\u003e\nexamiwillpasstheexam\u003cbr\u003e\n5\u003cbr\u003e\nwill\u003cbr\u003e\npass\u003cbr\u003e\nthe\u003cbr\u003e\nexam\u003cbr\u003e\ni\u003cbr\u003e\n\n\u003c/td\u003e\n    \u003ctd valign=\"top\"\u003e\nYES\u003cbr\u003e\n\n\u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/tbody\u003e\u003c/table\u003e\n\n\u003c/details\u003e\n\n---\n\n## Подготовка к собеседованиям\n\n[contest.yandex.ru](https://contest.yandex.ru/contest/34147/problems/)\n\n---\n\n\n## Полезные источники\n\nРесурсы для самостоятельного изучения. В основном они на английском, но есть и материалы, переведённые на русский язык.\n\n---\n\n\u003cdetails\u003e\n\u003csummary\u003e\n\u003cb\u003eСамое необходимое\u003c/b\u003e\n\u003c/summary\u003e\n  \n  1. \u003ca href=\"https://leetcode.com/problemset/algorithms/\"\u003eLeetCode\u003c/a\u003e — самый большой банк задач с собеседований. Любая задача, которая когда-либо задавалась на алгоритмическом собеседовании, наверняка есть тут. Задачи можно фильтровать по компаниям, тегам и сложности. Советуем заходить сюда регулярно — и чтобы готовиться к интервью, и чтобы поддерживать навык решения задач.\u003cbr\u003e\n  2. \u003ca href=\"https://www.youtube.com/c/pavelmavrin/videos\"\u003eВидеолекции Павла Маврина\u003c/a\u003e - Подойдут как для лучшего понимания тем из курса, так и для изучения новых, в том числе весьма продвинутых.\n  \n\u003c/details\u003e\n\n---\n\n\u003cdetails\u003e\n\u003csummary\u003e\n\u003cb\u003eПодготовка к интервью\u003c/b\u003e\n\u003c/summary\u003e\n  \n  1. Книга «Карьера программиста» или в оригинале “Cracking the Coding Interview”. Содержит много советов про подготовку к алгоритмическим собеседованиям. Будет полезна в дополнение к урокам 1 спринта нашего курса.\u003cbr\u003e\n  2. \u003ca href=\"https://www.interviewbit.com/courses/programming/\"\u003eInterviewBit\u003c/a\u003e — другой хороший ресурс с задачами для собеседований. Не нужно возиться с фильтрами, можно пройти по всем интересующим темам.\u003cbr\u003e\n  3. \u003ca href=\"https://www.pramp.com/#/\"\u003ePramp\u003c/a\u003e — сервис для проведения peer-to-peer пробных интервью на английском языке. Вам назначается случайный человек в пару и вы собеседуете его, а потом он — вас. Очень полезно попробовать себя в роли не только собеседуемого, но и собеседущего — это поможет вам лучше почувствовать, как интервьюер оценивает кандидата. Очень рекомендуем в процессе подготовки к алгоритмическим интервью на английском языке.\u003cbr\u003e\n  4. \u003ca href=\"https://habr.com/ru/company/yandex/blog/449890/\"\u003eКак проходят алгоритмические секции на собеседованиях в Яндекс\u003c/a\u003e — статья про подготовку к собеседованиям от Яндекса.\u003cbr\u003e\n  5. Вебинар \u003ca href=\"https://www.youtube.com/watch?v=aYuAd-IDigc\"\u003e«Открытое алгоритмическое собеседование»\u003c/a\u003e. Можно посмотреть перед тем, как вы пойдёте на первое пробное интервью, чтобы прочувствовать формат в динамике.\u003cbr\u003e\n  6. \u003ca href=\"https://github.com/jwasham/coding-interview-university\"\u003eCoding Interview University\u003c/a\u003e — самый полный гайд по подготовке к собеседованиям. Настолько полный, что на его прохождение потребуется очень много времени: автор говорит о 8–12 часов в день в течение 8 месяцев. Поэтому оставляем его тут на случай, если вы настроены максимально решительно.\u003cbr\u003e\n  \n\u003c/details\u003e\n\n---\n\n\u003cdetails\u003e\n\u003csummary\u003e\n\u003cb\u003eБолее академическое изучение\u003c/b\u003e\n\u003c/summary\u003e\n  \n  1. Книга «Алгоритмы. Построение и анализ» — классический труд по теории алгоритмов и структур данных. Много тем, включая математику, но большой объём и академический стиль изложения.\u003cbr\u003e\n  2. \u003ca href=\"http://codeforces.com/\"\u003eCodeforces\u003c/a\u003e — портал, посвящённый спортивному программированию. Мы рекомендуем его в контексте предыдущего пункта: тут вы сможете найти задачи на отработку тем, изученных в учебниках.\u003cbr\u003e\n  \n\u003c/details\u003e\n\n---\n\n\u003cdetails\u003e\n\u003csummary\u003e\n\u003cb\u003eГде можно проявить себя\u003c/b\u003e\n\u003c/summary\u003e\n  \n  1. \u003ca href=\"https://codingcompetitions.withgoogle.com/codejam\"\u003eGoogle Code Jam\u003c/a\u003e — ежегодное соревнование от Google, проходит в несколько этапов от простых отборочных до финала с очень сложными задачами. Попадание в Round 2 даёт хорошие шансы на то, чтобы с вами связался рекрутер Google. Если вы студент, то рекомендуем также поучаствовать в более простом Kick Start.\u003cbr\u003e\n  2. \u003ca href=\"https://www.facebook.com/hackercup\"\u003eFacebook Hacker Cup\u003c/a\u003e — аналогичное соревнование от Facebook.\u003cbr\u003e\n  3. \u003ca href=\"https://yandex.ru/cup/\"\u003eYandex Cup\u003c/a\u003e — соревнование от Яндекса. В отличие от вышеперечисленных, проводится не только по алгоритмам, но и по другим направлениям.\u003cbr\u003e\n  4. \u003ca href=\"https://adventofcode.com/\"\u003eAdvent of Code\u003c/a\u003e — это не столько соревнование, сколько возможность порешать и обсудить задачи с друзьями или коллегами.\u003cbr\u003e\n  \n\u003c/details\u003e\n\n---\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffuodorov%2Fyaalgorithms","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffuodorov%2Fyaalgorithms","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffuodorov%2Fyaalgorithms/lists"}