Сходство заметок о поездках велопроката

тема: Текст: мешок слов и TF-IDF · уровень: средний

Условие

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

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

Для каждой пары заметок вычисляется коэффициент Жаккара: J(A, B) = |A ∩ B| / |A ∪ B|. Требуется найти наибольший коэффициент Жаккара среди всех поездок. Если обе заметки поездки пусты, её коэффициент считается равным 0. Если наибольшее значение достигается у нескольких поездок, выводится это общее значение.

Формат ввода

В первой строке даны два целых числа n и m — число строк в таблице выдачи и число строк в таблице возврата.

В следующих n строках записана таблица выдачи. Каждая строка содержит идентификатор поездки trip_id, затем пробел и заметку выдачи.

В следующих m строках записана таблица возврата в таком же формате: идентификатор поездки trip_id, затем пробел и заметка возврата.

Заметка состоит из слов, разделённых одиночными пробелами. Вместо отсутствующей заметки записан единственный символ -.

Формат вывода

Выведите наибольший коэффициент Жаккара с тремя знаками после десятичной точки.

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

Ограничения

1 ≤ n = m ≤ 1000.

Всего во входе не более 2000 строк с данными о поездках.

Идентификатор trip_id — целое число от 1 до 10^9.

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

Длина заметки без идентификатора составляет от 1 до 120 символов.

Слово содержит от 1 до 20 строчных латинских букв.

В одной заметке не более 30 слов.

Решить задачу с автопроверкой на Python →

Куда дальше