Разбор ДВГУПС — тренировка 28

Правка ru5, от nikich340, 2017-08-13 15:33:54

А. Ярмарка оружия [реализация, математика]

Следовало последовательно сравнить силы наборов, если текущая сила строго больше максимальной предыдущей, то обновляем максимальную и индекс лучшего набора. Вычислить силу набора можно было в нецелых числах как (сумма si, j / wi), или сохранить числитель и знаменатель дроби (sumsmax и wmax) и сравнивая с текущим набором домножить обе части на (wmax·wi). Не стоит забывать, что суммирование 105 чисел до 109 приведёт к переполнению типа integer.

Код в нецелых числах: O(n)

B. Имённо-фамильный никнейм [перебор, строки]

Любое решение сводится к тому, чтобы максимизировать подстроку в n (ведь чем больше символов мы возьмём из n, тем меньше потребуется из f).

Обозначим длину такой подстроки за k.

1) Наивное решение может проверять все подстроки строки n для поиска максимального k, после чего искать недостающий конец строки в f. Это будет работать за O(q * |n|2 + q * |f|) в теории, однако лишь в худшем частном случае, когда множество раз наблюдается значительное совпадение подстроки с первой часть строки si (пример: n = " ", f = " ", и все si = " "). Код

2) Подсчитать все возможные подстроки для n за |n|2, сложить в set или бор, или подсчитать хеши (это будет работать аналогично set). Теперь для каждого si можно последовательно искать k, после чего можно пройтись последовательно по f, узнав, есть ли там оставшиеся |si| - k символов. При использовании set или хешей можно также искать k бинарным поиском, укорачивая или удлиняя текущую строку до длины M на каждой итерации и ища ей соответствие в подстроках n. Асимптотики такого решения: \begin{itemize} \item {Для хешей или set: \begin{enumerate} \item если искать k последовательно: O(q * k * log2(|n|2) + q * |f|) \item бинарным поиском: O(q * log2(k) * log2(|n|2) + q * |f|) \end{enumerate} } \item Для бора: O(q * k + q * |f|) \end{itemize} Код с set, последовательное $k$ Код с set, бинарный поиск по $k$ Код с бором

2) Развернём n, f, и si задом наперёд. Тогда нам нужно максимизировать не подстроку, а подпоследовательность в f, в этом единственное отличие от предыдущего варианта. Искать k для подпоследовательности можно только последовательно, после чего нам нужно найти в n подстроку длины |n| - k, для чего опять же следует предподсчитать все возможные подстроки для n за |n|2 и сложить их в какую-нибудь структуру. Асимптотика решения: \begin{itemize} \item Для хеша или set: O(q * k + q * log2(|n|2)) \item Для бора: O(q * k + q * |n|) \end{itemize}

Теги разбор, двгупс, тренировка

История

 
 
 
 
Правки
 
 
  Rev. Язык Кто Когда Δ Комментарий
ru23 Русский nikich340 2017-08-15 02:06:12 57
ru22 Русский nikich340 2017-08-14 03:38:53 0 (опубликовано)
ru21 Русский nikich340 2017-08-14 03:37:24 0
ru20 Русский nikich340 2017-08-14 03:37:24 6
ru19 Русский nikich340 2017-08-14 03:35:31 879 Мелкая правка: 'няется $x^cnt[x] % m$. Сде' -> 'няется $x^{cnt[x]} % m$. Сде'
ru18 Русский nikich340 2017-08-14 03:21:52 1685
ru17 Русский nikich340 2017-08-14 02:55:25 337 Мелкая правка: '(b + 1)$\n$\frac{f' -> '(b + 1)$\n\n$\frac{f'
ru16 Русский nikich340 2017-08-14 02:47:51 294
ru15 Русский nikich340 2017-08-14 02:43:54 387
ru14 Русский nikich340 2017-08-14 02:38:00 2110
ru13 Русский nikich340 2017-08-14 02:19:17 112
ru12 Русский nikich340 2017-08-14 02:17:37 2 Мелкая правка: 'руктуру.\nАсимптот' -> 'руктуру.\n\nАсимптот'
ru11 Русский nikich340 2017-08-14 02:16:48 72 Мелкая правка: 'решения:\n- Для хе' -> 'решения:\n\n- Для хе'
ru10 Русский nikich340 2017-08-14 02:14:24 189
ru9 Русский nikich340 2017-08-13 15:40:50 4
ru8 Русский nikich340 2017-08-13 15:39:04 139
ru7 Русский nikich340 2017-08-13 15:35:40 15
ru6 Русский nikich340 2017-08-13 15:34:54 10
ru5 Русский nikich340 2017-08-13 15:33:54 427
ru4 Русский nikich340 2017-08-13 15:20:03 2245 Мелкая правка: 'ематика]\nСледовал' -> 'ематика]\n\nСледовал'
ru3 Русский nikich340 2017-08-13 15:15:48 16
ru2 Русский nikich340 2017-08-13 15:15:20 616
ru1 Русский nikich340 2017-08-13 14:57:12 113 Первая редакция (сохранено в черновиках)