ENG  RUSTimus Online Judge
Online Judge
Задачи
Авторы
Соревнования
О системе
Часто задаваемые вопросы
Новости сайта
Форум
Ссылки
Архив задач
Отправить на проверку
Состояние проверки
Руководство
Регистрация
Исправить данные
Рейтинг авторов
Текущее соревнование
Расписание
Прошедшие соревнования
Правила

2201. Киберспортивный турнир

Ограничение времени: 2.5 секунды
Ограничение памяти: 256 МБ
Илья является администратором самой популярной многопользовательской киберспортивной дисциплины. Руководство каждый раз отправляет его в командировки, чтобы администрировать оффлайн турниры. Илья — профессионал своего дела, поэтому руководство уверено в том, что все соревнования, которые будет администрировать Илья, пройдут без технических неполадок!
На одном из крупнейших турниров Илья вновь был администратором и имел ник «admin» (без кавычек). Конечно же, наш герой очень ответственный и пришёл на работу заранее и сразу же вошёл в игру, а также собирается сидеть на ней допоздна, не отвлекаясь.
Как известно, организация турниров — вещь очень сложная и долгая. Пока все участники соревнования подключатся, некоторые из них могут отойти ненадолго по разным причинам и не быть в сети, и задержка происходит зачастую как раз из-за них. Ну а пока происходит длительное подключение всех игроков, в чате все желают друг другу удачи и веселья в предстоящем матче. От смертельной скуки Илье стало интересно, какую удачу имеет каждый игрок в матче. Илья считает, что удача — положительное вещественное число, имеющееся у каждого игрока.
Сообщением формата GLHF будем называть сообщение, состоящее только из букв алфавита {«gl», «hf»} (без кавычек). Иначе говоря, сообщение формата GLHF — это строка, содержащая только пары букв «gl» и «hf». Например: «glglglhfhf», «hf», «hfgl». В частности, все сообщения формата GLHF имеют чётную длину. Игроки посылают сообщения только формата GLHF.
Каждый игрок (включая администратора) в самом начале имеет удачу, равную единице. Илья считает, что удача игрока увеличивается в A раз каждый раз, когда он в чате видит пожелание удачи («gl» — good luck), и сокращается в B раз каждый раз, когда он видит пожелание провести хорошо время и повеселиться («hf» — have fun) (как известно, в напряжённом матче не стоит расслабляться и веселиться). Если в сообщении «gl» и/или «hf» написано несколько раз, то удача увеличивается в A раз и уменьшается в B раз за каждую пару символов «gl» и «hf» соответственно.
Обдумав всё это, Илья захотел сравнить удачи игроков, и хоть времени на это у него предостаточно, он поручил вам реализовать небольшую утилиту.
Ваша маленькая утилита получает на вход корректные логи — сообщения формата:
«[hh:mm:ss] AUTHOR_NICK: /command» (без кавычек), где [hh:mm:ss] — время в формате [часы:минуты:секунды], AUTHOR_NICK — ник игрока, command — команда. Возможных команд несколько:
  • /j, /join — игрок AUTHOR_NICK подключается к игре. После подключения игрок может видеть все последующие личные и общие сообщения в чате. На данную команду сервер может ответить:
    • «Successful» — если на момент выполнения команды игрок не находился в игре.
    • «Failed: AUTHOR_NICK is already on the server» — если игрок уже в игре.
  • /q, /quit — игрок AUTHOR_NICK отключается от игры. После отключения игроку не приходят никакие последующие личные или общие сообщения, пока он не войдёт повторно. Выход с сервера не меняет удачу игрока, и после повторного захода удача будет такой, какой она была при выходе. Сервер должен ответить:
    • «Successful»
  • /o, /online — игрок AUTHOR_NICK хочет узнать, сколько сейчас человек онлайн. Сервер должен вывести:
    • «There are X players on the server» — где вместо X написано количество людей на сервере (включая администратора).
  • /s [glhf], /say [glhf] — игрок AUTHOR_NICK пишет в общий чат сообщение формата GLHF, по длине не превосходящее M. Это сообщение увидят все подключенные игроки (включая администратора). Такие сообщения не влияют на удачу самого автора. Сервер должен ответить:
    • «AUTHOR_NICK: [glhf]» — вывод имени игрока и его сообщения.
  • /w<RECIPIENT_PLAYER> [glhf], /write<RECIPIENT_PLAYER> [glhf] — игрок AUTHOR_NICK пишет личное сообщение игроку RECIPIENT_PLAYER формата GLHF, по длине не превосходящее M. В этом случае сообщение видит только RECIPIENT_PLAYER, но только если он подключен к игре. При отсутствии адресата на сервере никаких сообщений об ошибке не возникает. Такие сообщения не влияют на удачу самого автора. Игрок не может написать сообщение самому себе. Сервер должен ответить:
    • «AUTHOR_NICK (to RECIPIENT_PLAYER): [glhf]» — вывод имени игрока, имени получателя и сообщения.
  • /c<PLAYER>, /compare<PLAYER> — данная команда доступна только для игрока admin. Команда предназначена для сравнения удачи администратора с игроком PLAYER. Сервер может ответить на данную команду следующее:
    • «Failed: you have no such rights» — если AUTHOR_NICK не является admin (Наивысший приоритет проверки).
    • «Failed: PLAYER is not on the server» — если PLAYER в данный момент не находится в игре.
    • «PLAYER is a loser» — если удача admin больше, чем удача игрока PLAYER
    • «PLAYER is good» — если удача admin равняется удаче игрока PLAYER
    • «PLAYER is a lucky guy» — если удача admin меньше, чем удача игрока PLAYER
  • /c<PLAYER1>-<PLAYER2>, /compare<PLAYER1>-<PLAYER2> — данная команда так же доступна только для игрока admin. Команда предназначена для сравнения удачи игрока PLAYER1 с удачей игрока PLAYER2. Сервер может ответить на данную команду следующее:
    • «Failed: you have no such rights» — если AUTHOR_NICK не является admin (Наивысший приоритет проверки).
    • «Failed: PLAYER1 is not on the server» — если PLAYER1 в данный момент не находится в игре. (Следующий по приоритету проверки)
    • «Failed: PLAYER2 is not on the server» — если PLAYER2 в данный момент не находится в игре.
    • «PLAYER2 is a loser» — если удача PLAYER1 больше, чем удача игрока PLAYER2
    • «Their luck is equal» — если удача PLAYER1 равняется удаче игрока PLAYER2
    • «PLAYER2 is a lucky guy» — если удача PLAYER1 меньше, чем удача игрока PLAYER2
За каждую встреченную подстроку «gl» и «hf» удача игрока увеличивается в A, либо уменьшается в B раз соответственно. Стоит заметить, что удача игрока не сбрасывается после отключения и повторного подключения к игре.
Ваша задача состоит в реализации данной утилиты!

Исходные данные

В первой строке через пробел вводятся целые числа N, M, A, B — количество команд, которые получит сервер, максимальное количество символов в сообщении, множитель удачи игрока, когда тот видит сообщение «gl», и делитель удачи игрока, когда тот видит сообщение «hf», соответственно (1 ≤ N ≤ 86400, 2 ≤ M ≤ 10, 1 ≤ A, B ≤ 109).
Далее идут N строк, в которых расположены логи сервера в хронологическом порядке, каждая строка имеет следующий формат:
«[hh:mm:ss] AUTHOR_NICK: /command» (без кавычек). Временные метки состоят из часов hh (от 0 до 23), минут mm (от 0 до 59) и секунд ss (от 0 до 59); каждое из этих чисел имеет ровно 2 цифры и при необходимости дополняется ведущим нулём. Временные метки не повторяются и идут строго по возрастанию. Ник игрока AUTHOR_NICK, а также все ники в аргументах команд /write и /compare — строки, состоящие из больших и маленьких латинских букв, цифр, а также символа «_» (код 95); длина каждого ника не превосходит 8 символов.
Логи турнира корректные, гарантируется отсутствие входящих команд от участников, не подключённых к игре, кроме команд /join. Все сообщения придерживаются формата GLHF и имеют длину не более M символов.
Изначально считается, что на сервере нет никого, кроме администратора, имеющего ник «admin». Администратор никогда не покидает сервер.
Гарантируется, что если операция сравнения удачи двух игроков показала, что их удача различается, то их значения удачи различаются хотя бы в 1.0001 раза.

Результат

Вывод должен содержать N строк — ответы сервера на запросы, где i строка соответствует ответу сервера на запрос в i + 1 строке входных данных.

Пример

исходные данныерезультат
18 4 2 4
[00:00:23] admin: /online
[00:01:02] j0e: /j
[00:01:15] j0e: /s hfhf
[00:01:17] j0e: /q
[00:01:18] admin: /write<j0e> hfhf
[00:03:25] Tea_: /join
[00:04:11] j0e: /join
[00:07:54] Tea_: /j
[00:08:30] admin: /say glgl
[00:08:37] admin: /write<j0e> hfhf
[00:09:00] Tea_: /compare<j0e>
[00:13:41] admin: /c<j0e>-<Tea_>
[00:13:44] j0e: /quit
[00:13:57] admin: /compare<j0e>
[00:27:49] j0e: /j
[00:28:01] j0e: /s hfhf
[00:30:19] admin: /compare<j0e>
[00:30:43] admin: /compare<Tea_>-<j0e>
There are 1 players on the server
Successful
j0e: hfhf
Successful
admin (to j0e): hfhf
Successful
Successful
Failed: Tea_ is already on the server
admin: glgl
admin (to j0e): hfhf
Failed: you have no such rights
Tea_ is a lucky guy
Successful
Failed: j0e is not on the server
Successful
j0e: hfhf
j0e is a lucky guy
Their luck is equal

Замечания

Пояснение к примеру:
  • После команды «[00:01:15] j0e: /s hfhf» удача admin сократилась в 42 раза. Удача j0e не меняется.
  • После команды «[00:01:18] admin: /write<j0e> hfhf» удача игрока j0e не изменилась, так как он отключен от игры. Удача admin также не изменилась.
  • После команды «[00:08:30] admin: /say glgl» удача j0e и Tea_ увеличивается в 22 раза. Удача admin не меняется. Теперь удачи у игроков следующие: admin: 1/42; j0e: 22; Tea_: 22.
  • После команды «[00:08:37] admin: /write<j0e> hfhf» удача j0e сокращается в 42 раза и становится равной 22/42. Удача admin не меняется.
  • Выполнение команды «[00:09:00] Tea_: /compare<j0e>» вызовет ошибку, потому что Tea_ не имеет достаточно прав для её выполнения.
  • Команда «[00:13:41] admin: /c<j0e>-<Tea_>» сравнивает удачи игроков j0e и Tea_, их удача равна 22/42 и 22 соответственно. У Tea_ удача выше, поэтому ответ сервера: «Tea_ is a lucky guy».
  • Выполнение команды «[00:13:57] admin: /compare<j0e>» вызовет ошибку, так как игрок j0e не подключен к игре. Ответ сервера: «Failed: j0e is not on the server».
  • После команды «[00:28:01] j0e: /s hfhf» удача игроков admin и Tea_ сокращается в 42 раза. Удача j0e не меняется.
  • Командой «[00:30:19] admin: /compare<j0e>» admin желает сравнить свою удачу с удачей игрока j0e. Их удачи составляют 1/44 и 22/42 соответственно. Удача j0e больше, поэтому ответ сервера: «j0e is a lucky guy».
  • Командой «[00:30:43] admin: /compare<Tea_>-<j0e>» admin желает сравнить удачу игрока Tea_ с удачей игрока j0e. Их удачи равны 22/42 и 22/42 соответственно. Их удача равна, поэтому ответ сервера: «Their luck is equal».
Автор задачи: Вадим Баринов
Источник задачи: Вузовско-академическая олимпиада по информатике 2020