Задача на реализацию

96 задач
Число у задачи — рейтинг сложности, слово рядом — насколько она трудна по сравнению с другими задачами такого же типа. Шкалы задач с ответом и задач с кодом между собой не сравниваются. Рядом — счётчики попыток: успешные, неуспешные.

Радиоуправляемый робот умеет перемещаться по клетчатому полю размером \(n \times m\) (\(n\) строк и \(m\) столбцов) и красить клетки в один из четырех цветов (красный, зеленый, синий и белый). Будем обозначать клетку на пересечении \(i\)-й сверху строки и \(j\)-го слева столбца как \((i, j)\).

Робот выполняет команды пользователя, при этом перемещаясь по полю в соответствии с заданными настройками и ограничениями.

Настройки представляют собой матрицу \(S\) размера \(n \times m\), каждый элемент которой — либо \(\varnothing\), либо пара из направления (вправо, вверх, влево, вниз) и цвета. Если \(S_{i,j} = (d, c)\), то после того, как робот красит клетку \((i, j)\) в какой-либо цвет, он сразу же смещается на одну клетку в направлении \(d\) и красит ее в цвет \(c\). Если для новой покрашенной клетки \(S_{i',j'} \neq \varnothing\), процесс продолжается по тем же правилам.

Ограничения бывают двух типов:

  1. ограничение на максимальное разрешенное число клеток цвета \(c\);

  2. запрет наличия на поле квадрата \(2 \times 2\), покрашенного цветами \(\begin{pmatrix} c_{1,1} & c_{1,2} \\ c_{2,1} & c_{2,2} \end{pmatrix}\).

Пользователю доступны следующие команды для взаимодействия с роботом:

  1. <<color \(i\) \(j\) \(c\)>> — закрасить клетку \((i, j)\) в цвет \(c\), после чего выполнять действия в соответствии с настройками; процесс останавливается, когда

    • очередное перемещение привело робота за границу поля;

    • очередное перемещение привело робота в клетку, которую он уже красил в процессе выполнения текущей команды;

    • для очередной клетки \(S_{i',j'} = \varnothing\);

    • с очередной покраской перестанет выполняться какое-то из ограничений.

    Обратите внимание, что если первая же покраска клетки \((i, j)\) в цвет \(c\) приводит к нарушению какого-то из ограничений, робот остановится сразу же, не покрасив ни одну клетку.

  2. <<limit \(c\) \(x\)>> — выставить ограничение на максимальное число клеток цвета \(c\) в \(x\). Если в настоящий момент на поле уже больше \(x\) клеток цвета \(c\), команда игнорируется и ограничение не меняется. Для каждого цвета в каждый момент времени действует только последнее введенное на него ограничение на число клеток.

  3. <<block \(c_{1,1}\) \(c_{1,2}\) \(c_{2,1}\) \(c_{2,2}\)>> — запретить появление квадратов \(2 \times 2\), раскрашенных цветами \(\begin{pmatrix} c_{1,1} & c_{1,2} \\ c_{2,1} & c_{2,2} \end{pmatrix}\). Если в настоящий момент на поле уже есть квадрат, раскрашенный таким образом, команда игнорируется и ограничение не добавляется.

  4. <<allow \(c_{1,1}\) \(c_{1,2}\) \(c_{2,1}\) \(c_{2,2}\)>> — аналогично, отменить запрет на раскрашенные соответствующим образом квадраты \(2 \times 2\), если такой запрет сейчас есть.

  5. <<settings \(i\) \(j\) \(d\) \(c\)>> — выставить настройки для клетки \((i, j)\) в значение \((d, c)\), где \(d\) — направление перемещения, а \(c\) — цвет, в который затем будет раскрашена клетка, в которую робот переместится.

  6. <<settings \(i\) \(j\) none>> — выставить настройки для клетки \((i, j)\) в значение \(\varnothing\), соответствующее отсутствию перемещения после покраски клетки \((i, j)\).

Еще раз повторим, что робот никогда не красит одну и ту же клетку дважды во время исполнения одной команды, а также останавливается до момента первого нарушения какого-либо ограничения. Например, если \(S_{1,1} = (\rightarrow, \mathtt{red})\), \(S_{1,2} = (\downarrow, \mathtt{blue})\), \(S_{2,2} = (\leftarrow, \mathtt{green})\) и \(S_{2,1} = (\uparrow, \mathtt{red})\), то при поступлении команды <<color \(1\) \(1\) blue>>, робот покрасит \((1, 1)\) в синий, \((1, 2)\) в красный, \((2, 2)\) в синий и \((2, 1)\) в зеленый. Затем робот остановится, так как клетка \((1, 1)\) уже была покрашена при исполнении этой команды.

Изначально все настройки равны \(\varnothing\), никакие ограничения не введены, а все клетки поля покрашены в белый цвет. Вам дан список из \(q\) команд пользователя, которые были последовательно отправлены роботу. Выведите раскраску поля после применения всех этих команд.

Формат входных данных
В первой строке записано целое число \(t\) (\(1 \le t \le 1000\)) — число наборов входных данных в тесте.

В первой строке каждого набора данных даны три целых положительных числа \(n\), \(m\) и \(q\) — размеры поля и число команд. Гарантируется, что сумма \(n \cdot m \cdot q\) по всем наборам входных данных не превосходит \(10^5\).

В следующих \(q\) строках дано описание команд, посланных роботу в формате, описанном в условии. Направления задаются строками <<right>> (вправо), <<up>> (вверх), <<left>> (влево), <<down>> (вниз). Цвета задаются заглавными буквами ‘R’ (красный), ‘G’ (зеленый), ‘B’ (синий) и ‘W’ (белый).

Формат выходных данных
Для каждого набора входных данных выведите итоговую раскраску поля, полученную после обработки всех команд.

Примечание

В первом примере из условия

  1. Команда <<color 1 1 R>> красит \((1, 1)\) в красный, после чего из-за \(S_{1,1} = (\downarrow, \mathtt{red})\) клетка \((2, 1)\) тоже красится в красный, а из-за \(S_{2,1} = (\downarrow, \mathtt{red})\) затем и \((3, 1)\) красится в красный.

  2. При выполнении <<color 2 1 G>> робот красит \((2, 1)\) в зеленый. \(S_{2,1}\) в этот момент уже равно \((\rightarrow, \mathtt{blue})\), поэтому после этого клетка \((2, 2)\) должна быть покрашена в синий, но это бы нарушило ограничение <<limit B 0>>, поэтому процесс останавливается до этого.

  3. После этого поле выглядит как

    RW
    GW
    RW
  4. Затем <<color 2 2 R>> должен покрасить \((2, 2)\) в красный, но это бы привело к получению квадрата с цветами RWGR, который запрещен, поэтому выполнение команды сразу останавливается.

  5. Последняя команда покраски <<color 2 2 B>> отрабатывает корректно, так как до этого было разрешено иметь на поле не больше \(1\) синей клетки. После чего, в соответствии с \(S_{2,2} = (\uparrow, \mathtt{green})\), клетка \((1, 2)\) красится в зеленый.

  6. Итоговый рисунок:

    RG
    GB
    RW

Напишите программу, которая выполняет глобальное выравнивание двух ДНК-последовательностей, и выводит все выравнивания и их score (балл).

Формат входных данных
Две строки содержит две последовательности ДНК, далее вводятся настройки параметров:
  • Балл за совпадение
  • Балл за несовпадение
  • Балл за открытие гэпа
  • Балл за продолжение гэпа
Формат выходных данных
Выведите все выравнивания и их score (балл).
Город Летовецк славится своими туристическими маршрутами. Каждый маршрут проходит через несколько достопримечательностей. Многие туристы желают посетить город, но не у всех хватает времени увидеть все достопримечательности. Туристам предлагают составить список достопримечательностей, которые они бы хотели посетить. Турагент в ответ выбирает для них самый короткий маршрут, включающий все выбранные достопримечательности. 
В последнее время туристов стало так много, что турагент не успевает анализирвать маршруты. Помогите автоматизировать работу турагента, чтобы туристы не теряли времени в ожидании своего маршрута! 

Формат входных данных
В первой строке вводится натуральное число n - количество туристических маршрутов в городе (1 <= n <= 105). Во следующих n строках вводятся сами маршруты. Каждая строка с маршрутов представляет собой список достопримечательностей (слов), разделенных одним пробелом. Количество достопримечательностей в каждой строке не превышает 109. Каждая достопримечательность записана в виде отдельного слова, состоящего только из английских букв и/или цифр.
Последняя строка содержит список достопримечетельностей, которые хочет увитеть турист.  Формат этой строки такой же как и в строках выше.
Гарантируется, что самый короткий подходящий маршрут существует и он единственный.

Формат выходных данных
Выведите самый короткий маршрут, включающий все выбранные туристом достопримечательности. Строка с маршрутом должна соответствовать какой-либо одной строке из входных данных.

Горнолыжник, готовясь к соревнованиям, нарисовал на бумаге схему горнолыжной трассы для выбора оптимального маршрута спуска. На схеме расположенные на трассе ворота представлены горизонтальными отрезками. Никакая пара ворот не имеет общих точек. 

Маршрут должен представлять собой ломаную, начинающуюся в точке старта на вершине горы и заканчивающуюся в точке финиша у ее подножия. Маршрут выбирается таким образом, что y-координата каждой следующей вершины ломаной оказывается строго меньше y-координаты предыдущей вершины. Один из возможных маршрутов представлен на рисунке.

За каждые ворота, через которые не проходит маршрут, лыжнику начисляются штрафные очки. Общий штраф за спуск по маршруту вычисляется как сумма длины маршрута и штрафных очков за непройденные ворота.

Требуется написать программу, которая определяет, какой минимальный общий штраф горнолыжник может получить при прохождении трассы.

Входные данные
В первой строке входного файла задано число N - количество ворот на трассе (0 ≤ N ≤ 500), в следующих двух строках заданы Sx, Sy, Fx, Fy - координаты точек старта и финиша соответственно. В каждой из следующих N строк записаны четыре числа ai, bi, yi, ci - x-координаты левого и правого концов ворот, y-координата ворот и штраф за непрохождение данных ворот (ai < bi, Fy < yi < Sy, ci - целое число, 0 ≤ ci ≤ 10000). Все координаты - целые числа, не превосходящие по модулю 10000.

Выходные данные
В выходной файл выведите наименьший возможный общий штраф за прохождение трассы с точностью не менее 4 знаков после десятичной точки.

На проверку сдается код, содержащий только описание класса.

Объявите класс с именем ListMath, объекты которого можно создавать командами:

lst1 = ListMath() # должен создаваться пустой список
lst2 = ListMath([1, 2, -5, 7.68]) # список с начальными значениями

В качестве значений элементов списка объекты класса ListMath должны отбирать только целые и вещественные числа, остальные игнорировать (если указываются в списке). Например:

lst = ListMath([1, "abc", -5, 7.68, True]) # ListMath: [1, -5, 7.68]

В каждом объекте класса ListMath должен быть публичный атрибут:

lst_math - ссылка на текущий список объекта (для каждого объекта создается свой список).

Также с объектами класса ListMath должны работать следующие операторы:

lst = lst + 76 # сложение каждого числа списка с определенным числом
lst = 6.5 + lst # сложение каждого числа списка с определенным числом

Команда print(lst1) - в скобка указывается объект класса - должна выводить элементы массива в одной строку, разделяя элементы одним пробелом. В случае если список не содержит элементов, должна выводиться надпись Cписок пуст.

lst1 = ListMath()
print(lst1)    # Список пуст
lst2 = ListMath([1, "abc", -5, 7.68, True]) 
print(lst2)    # 1 -5 7.68
ООП-6#55922
Что называют атрибутами класса?
  1. Только переменные класса
  2. Экземпляры (объекты) класса
  3. Только методы класса
  4. Переменные и имена методов (ссылки на методы) класса
ООП-5#55921
Что называется методом класса?
  1. Любая (не статическая) функция, объявленная внутри класса
  2. Такого термина в ООП нет
  3. Переменные и функции внутри класса
  4. Любая переменная, объявленная внутри класса
 Можно ли создавать программы без использования ООП?

Объявите в программе класс WindowDlg, объекты которого предполагается создавать командой:

wnd = WindowDlg(заголовок окна, ширина, высота)

В каждом объекте класса WindowDlg должны создаваться приватные локальные атрибуты:

__title - заголовок окна (строка);
__width, __height - ширина и высота окна (числа).

В классе WindowDlg необходимо реализовать метод:

show() - для отображения окна на экране (выводит в консоль строку в формате: "<Заголовок>: <ширина>, <высота>", например "Диалог 1: 100, 50").

Также в классе WindowDlg необходимо реализовать два объекта-свойства:

width - для изменения и считывания ширины окна;
height - для изменения и считывания высоты окна.

При изменении размеров окна необходимо выполнять проверку:

- переданное значение является целым числом в диапазоне [0; 10000].

Если хотя бы один размер изменился (высота или ширина), то следует выполнить автоматическую перерисовку окна (вызвать метод show()). При начальной инициализации размеров width, height вызывать метод show() не нужно.

В программе нужно объявить только класс с требуемой функциональностью.

Объявите в программе класс Car, в котором реализуйте объект-свойство с именем model для записи и считывания информации о модели автомобиля из локальной приватной переменной __model.

Объект-свойство объявите с помощью декоратора @property. Также в объекте-свойстве model должны быть реализованы проверки:

- модель автомобиля - это строка;
- длина строки модели должна быть в диапазоне [2; 100].

Если проверка не проходит, то локальное свойство __model остается без изменений.

Объекты класса Car создаются командой:

car = Car()

и далее работа с объектом-свойством происходит следующим образом:

car.model = "Toyota"

Ваша задача написать ТОЛЬКО класс. 

Дана таблица кодировки символов и некоторый код. Определите символ, которому этот код соответствует. Все коды представляют собой непустые последовательности из символов ‘0’ и ‘1’.

Входные данные
Сначала вводится число N – количество символов в кодовой таблице (целое, положительное, не превышает 10), затем вводится D – длина кода каждого символа (целое, положительное, не превышает 20).

Затем следует N строк в формате <символ><пробел><код>. В самом конце вводится код, который необходимо декодировать. Все символы являются заглавными латинскими буквами.

Выходные данные
Выведите символ, которому соответствует заданный код при такой кодировке или слово IMPOSSIBLE, если однозначное декодирование невозможно.
Кеннинг – это форма поэтической метафоры в древности, когда одно слово заменяется словосочетанием (двумя или более словами). Например, “giver of the gold” – это кеннинг для слова “warrior”. Причем нет разницы в использовании слова и его кеннинга: “poor giver of the gold” и “poor warrior” – это одно и то же. Кеннинги могут быть вложенными. Так, “serpent’s lair” означает “gold”, поэтому “giver of the serpent’s lair” означает “warrior”.

Для зачета вам надо создать достаточно длинный текст. Это можно сделать быстро, имея план текста и список кеннингов. Будем использовать следующий алгоритм. Если текст уже достаточно длинный, то задание выполнено. В противном случае одновременно заменяем все слова в тексте, имеющие кеннинги на соответствующие кеннинги, затем алгоритм повторяется снова.

Входные данные
В первой строке входных данных содержатся 3 числа: ширина результирующего текста w (1≤w≤255), минимальное число непробельных символов в тексте l (1≤l≤3000) и число кеннингов в списке n (1≤n≤380). Далее следует список кеннингов, по одному в строке. Каждая строка сначала содержит заменяемое слово, а за ним следует соответствующее словосочетание. В конце входных данных в одной или нескольких строках содержится план текста.

Каждый кеннинг содержит по крайней мере 2 слова (т.е. одна строка содержит не менее трех слов). Кеннинги могут быть рекурсивными. Например, кеннинг для слова “GNU” может быть таким “GNU is Not UNIX”. Кеннинги чувствительны к грамматическим формам и даже к регистру букв, так слова “warrior”, “Warrior” и “warriors” различны и могут иметь разные кеннинги.

Входной файл не превосходит 3 000 байт и содержит только английские буквы, подчеркивания, пробелы, переводы строки и, в первой строке, цифры. Одно слово имеет только один кеннинг. Все слова состоят не более чем из w
 символов.

Соседние слова разделены в точности одним пробелом или переводом строки. Ни в одной из строк нет ведущих или хвостовых пробелов.

Выходные данные
Если алгоритм не даст результата, то выведите слова “No result” в единственной строке.

В противном случае выведите полученный текст, размещая не более w символов (включая пробелы) в строке. Все переводы строки из первоначального плана должны быть сохранены. Перед очередным словом надо вставить перевод строки, если оно не уместиться в текущей строке. Соседние слова должны быть разделены ровно одним пробелом. В строках не должно быть ведущих и хвостовых пробелов. В корректном тексте не будет больше 10 000 байт.
В стране Лаккиландии очень развит общественный транспорт. Проезд в нем бесплатный, но при этом каждому пассажиру при входе выдают билетик с уникальным номером. Особенно ценятся так называемые счастливые билетики.

Билетик называется счастливым, если сумма цифр на четных позициях в его номере равна сумме цифр на нечетных позициях.

Ване известно, что билеты выдаются подряд в порядке возрастания номеров. В очередной раз войдя в автобус Ваня получил свой очередной билет и тут ему стало интересно, какой существует минимальный счастливый билетик с номером, большим номера Ваниного билетика. Помогите Ване узнать ответ на этот вопрос.

Входные данные
В единственной строке входного файла задан номер Ваниного билетика − натуральное число, имеющее в своей десятичной записи не более 100 цифр.

Выходные данные
В выходной файл выведите минимальный номер счастливого билетика, который больше номера Ваниного билетика.
Billing#55178
Девочка Катя подключилась к тарифу “Очень выгодный”, на котором можно только звонить. Все входящие звонки бесплатны. В случае исходящего звонка не более k1 первых секунд звонка стоят p1 копеек, и позвонить можно только если эти деньги на счету есть. За следующие k2 секунд Катя платит по p2 копеек за секунду, а все остальное время девочка платит по p3 копеек за секунду. Деньги снимаются мгновенно после каждой секуны. Как только баланс становится неположительным, связь обрывается. Известно, что Катя положила N копеек на счет, чтобы поговорить со своим лучшим другом. Причем, она хочет потратить все N копеек на этот один телефонный звонок. Посчитатйте, сколько максимально секунд Катя сможет наслаждаться беседой.

Входные данные
Во входном файле записаны через пробел 6 целых чисел: 0 ≤ N ≤ 1000000, 1≤ k1,k≤ 1000000, 1 ≤ p1, p2, p≤ 1000000.

Выходные данные
В выходной файл выведите одно число: максимальное количество секунд, которое при заданных условиях могла выговорить девочка Катя в течение одного телефонного разговора.
Напишите программу, выполняющую функции очень простой электронной таблицы. Она работает с таблицей из 9 строк от 1 до 9 и 26 столбцов от A до Z. Клетки таблицы обозначаются именами, составленными из кодов столбца и строки, например, B1, S8.

Каждая клетка содержит выражение. Выражения используют целые константы, ссылки на клетки, скобки, бинарные операторы +, -, * и / (целочисленное деление). Например, 567, E8/2, (3+B3)*(C4-1) являются правильными выражениями. Все операторы целочисленные. Деление на ноль даёт в результате ноль.

Если значение ячейки, на которую ссылается некоторое выражение, не определено, оно считается равным нулю. Ситуация, когда две или более ячейки зависят друг от друга, является отдельным случаем - циклической ссылкой.

Ограничения: длина выражения в одной ячейке до 255 символов, все аргументы и результаты меньше 1 000 000.

Входные данные
Первая строка содержит число выражений N. Следующие N строк имеют формат <Имя клетки>=<выражение>. Все выражения корректные, и каждая ячейка определена не более чем одним выражением.

Выходные данные
В единственной строке выводится или значение клетки A1, или число 1000000 (один миллион), если значение клетки A1 не может быть найдено из-за циклической ссылки.
Анализ временной сложности алгоритмов - важный инструмент создания эффективных программ. Алгоритмы, выполняемые за линейное время, как правило, значительно быстрее алгоритмов, требующих для выполнения той же задачи квадратичного времени, так что предпочтение должно быть отдано первым.

Обычно определяют время выполнения алгоритма по отношению к n - "размеру" входных данных. Это может быть число объектов, которые нужно отсортировать, число точек многоугольника и т.п. Поскольку определение формулы зависимости временной сложности алгоритма от n - непростая задача, было бы замечательно, если бы её можно было автоматизировать. К сожалению, в общем случае это невозможно. Но в этой задаче мы будем рассматривать программы очень простой природы, над которыми это можно проделать. Рассматриваемые программы записаны согласно следующим правилам БНФ, где <число> может быть любым неотрицательным целым числом:
  • <Программа> ::= "BEGIN" <Список операторов> "END"
  • <Список операторов> ::= <Оператор> | <Оператор> <Список операторов>
  • <Оператор> ::= <Оператор LOOP> | <Оператор OP>
  • <Оператор LOOP> ::= <Заголовок LOOP> <Список операторов> "END"
  • <Заголовок LOOP> ::= "LOOP" <число> | "LOOP n"
  • <Оператор OP> ::= "OP" <число>
Время выполнения такой программы может быть вычислено следующим образом: выполнение оператора OP требует столько единиц времени, сколько указано в его параметре. Список операторов, заключённый в оператор LOOP, выполняется столько раз, сколько указано в параметре оператора, то есть или заданное константное число раз, если задано число, или n раз, если параметром является n. Время выполнения списка операторов равно сумме времени выполнения его частей. Таким образом, время выполнения программы в целом зависит от n.

Входные данные
В первой строке находится целое число k - число программ во входном файле. Затем идут k программ, удовлетворяющих приведённой грамматике. Пробелы и переводы строк могут встречаться везде в программе, но не в ключевых словах BEGIN, END, LOOP и OP, нет их и в целых числах.

Выходные данные
Для каждой программы сначала идёт строка с номером программы. В следующей строке записывается время работы программы в терминах n - многочлен степени не более 10. Многочлен должен быть записан обычным способом, то есть подобные слагаемые должны быть приведены, слагаемое с большей степенью должно предшествовать слагаемому с меньшей степенью, слагаемые с коэффициентом 0 не записываются, множители 1 не записываются. Общий вид второй строки "Runtime = a*n^10+b*n^9+...+i*n^2+j*n+k". Если время выполнения нулевое, нужно вывести "Runtime = 0". За строкой с многочленом должна следовать пустая строка.

Ограничения: вложенность операторов LOOP не превышает 10, размер входного файла не более 2 Кбайт, коэффициенты многочлена в ответе не превышают 50 000.
Для идентификации ресурсов в сети Internet используются URL (Uniform Resource Locator). URL состоит из нескольких элементов: протокол, хост, порт, путь, файл и секция. Некоторые элементы URL могут быть опущены. Рассмотрим упрощенный формат URL:

[протокол://]хост[:порт][путь/[файл[#секция]]]
Заключенные в квадратные скобки элементы могут быть опущены, т.е. например, можно не указать протокол или секцию. Но, например, если указан файл, то обязательно должен быть указан путь. Регистр букв в элементах URL не важен.

Рассмотрим кратко все элементы URL:

*Протокол - это способ доступа к файлу, URL с разными протоколами и одинаковыми остальными элементами могут указывать на различные ресурсы.
*Хост и порт - это имя некоторого сервера в сети и способ доступа к нему (порт - натуральное число, не превосходящее 65535).
*Путь представляет собой путь к файлу, содержащему запрашиваемый ресурс, от некоторого каталога на сервере, который называется корневым. При этом для разделения имен каталогов используется символ "/". Путь, если он не пуст, всегда начинается с символа "/". Специальное обозначение '.' соответствует самому каталогу, '..' - родительскому каталогу.
*Файл - это файл, содержащий запрашиваемый ресурс.
Наконец, файл может быть разбит на секции каким либо способом и можно указать, к какой именно секции вы хотите обратиться.

Различные символы в URL могут быть заменены своими шестнадцатеричными ASCII кодами с помощью символа %, например a = %41, Z = %5A. В коде всегда используется ровно две шестнадцатеричные цифры.

Некоторые символы могут встречаться в элементах URL только как шестнадцатеричные коды - все символы, кроме букв латинского алфавита, цифр и символов "." и "-", а некоторые не могут встречаться вообще: "\", "#", "*", "@", "%", "?", ":", ",", а также символы с ASCII-кодом меньше %20. Символ "/" может встречаться в элементах URL только в пути для разделения входящих в него каталогов. Имя файла не может состоять только из точек.

Рассмотрим примеры URL:

http://neerc.ifmo.ru/school
ftp://somewhere.net:1234/pub/files/coolgame.zip
nobody.nowhere.net/some%20dir/some%20file#some%20info


Ваша цель в этой задаче - помочь разработчикам web-сервера. Для web-сервера отсутствующие части URL имеют следующие значения по умолчанию:
Протокол http
Порт 80
Путь пустая строка
Файл index.html
Секция пустая строка


Различные как строки URL могут указывать на один и тот же ресурс, например следующие три URL:

neerc.ifmo.ru
http://neerc.ifmo.ru:80/index.html#
Http://NEERC.IFMO.Ru/Dir/../././

Для разграничения доступа к ресурсам необходимо уметь определять, указывают ли два различных URL на один и тот же ресурс. Помогите разработчикам написать соответствующую проверку.

Входные данные
Входные данные состоят из двух строк, каждая из них содержит URL. Оба URL удовлетворяют формату, приведенному в условии этой задачи. Длина каждого URL не превосходит 200 символов. Гарантируется, что ни один из промежуточных каталогов на пути к ресурсу не лежит выше корневого каталога (т.е. не может встретиться, например, URL http://somewhere.com/../dir/index.html) а также, что имена всех каталогов состоят по крайней мере из одного символа (два символа "/" не могут идти подряд в любом месте, кроме как непосредственно после двоеточия после имени протокола).

Выходные данные
Выведите YES, если оба URL, приведенные во входных данных, указывают на один и тот же ресурс, и NO в противном случае.

Наверняка все слышали про карточную игру "Покер". В джентльменском покере все, как и в обычном - игроки сидят за круглым столом, ставят ставки, повышают их, и кто-то в конце каждого раунда забирает выигрыш - банк. Только в джентльменском покере выигрыш раунда достается не одному игроку, а делится на K человек (K - степень щедрости). А точнее, банк делится поровну между победителем раунда и следующими K-1 игроками, сидящими за выигравшим (за последним сидит первый игрок). В случае, если сумма выигранного банка не делится поровну между K игроками, то излишек забирает победитель. Так, например, если играют 4 человека и степень щедрости равна 3, то при выигрыше первого игрока банк поделится между 1-ым, 2-ым и 3-им игроками, а при победе четвертого - между 4-ым, 1-ым и 2-ым. Ваша задача по протоколу игры сосчитать, сколько денег у каждого из игроков оказалось в конце игры. Т.к. покер джентльменский, то разрешается играть в долг.


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

В первой строке содержатся три положительных целых числа: N, K и S, где N - число игроков (игроки пронумерованы от 1 до N по направлению хода игры), K - степень щедрости и S - начальная сумма денег у каждого игрока, 2 <= N <= 30000, 1 <= K <= N, S <= 10500. Гарантируется, что долг игрока будет не менее, чем -215-1 и выигрыш не более, чем 215. Далее идут строки, описывающие протокол игры. Протокол игры состоит не более, чем из 210 событий. Возможные строки протокола игры:
BET A B - игрок под номером А добавляет в банк сумму B. В начале каждого раунда банк пуст.
WIN A - означает конец раунда и игрок под номером А забирает банк и делит его со следующими K-1 игроками.
END - означает конец игры. Данная строка является последней во входном файле.


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

Вывести конечные суммы, которые оказались у игроков к концу игры. Первое число - сумма денег первого игрока, затем через пробел - сумма второго, и т.д. до последнего. Всего N чисел.

Поделиться
Класснуть