Блог пользователя Stefan2417

Автор Stefan2417, 10 месяцев назад, По-русски

Рассмотрим следующую задачу:

Дано корневое дерево с $$$n$$$ вершинами. В каждой вершине записан символ $$$c_v \ (1 \leq c_v \leq C)$$$, где $$$C$$$ — размер алфавита. Для каждой вершины $$$v \ (1 \leq v \leq n)$$$ требуется посчитать значение префикс функции на вертикальном пути от корня до $$$v$$$.

Наивное решение

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

Вспомним, что префикс функция имеет амортизированную асимптотику, поэтому можно построить тест — кисточка, где бамбук состоит из одинаковых букв, а в листьях другие символы. Для каждого листа префикс функция будет искаться за глубину дерева, поэтому итоговая асимптотика составить $$$O (n^2)$$$.

Немного умнее

Будем считать $$$dp[v][sym]$$$ — значение префикс функции в вершине $$$v$$$, если мы перешли в нее по символу $$$sym$$$. Пересчитывать такую динамику удобнее всего лениво, используя пересчет префикс функции из стандартного алгоритма, но учитывая символ по которому перешли в вершину. Всего состояний динамики $$$n \cdot C$$$, и пересчитываются они суммарно за $$$O (n \cdot C)$$$, поэтому асимптотика будет $$$O (n \cdot C)$$$.

Что-то умное

Для удобства понимания представим переходы префикс функции как переходы автомата.

Помимо обычной префикс функции будем считать значение префикс функции, которое оканчивается на отличную от текущей букву, если переходить по переходам префикс функции. Более формально — ищем ближайший префикс после которого идет другой символ. Теперь при вычислении обычной префикс функции мы можем ходить по этим переходам и получить магическую асимптотику в $$$O (n)$$$.

Доказательство данного факта является нетривиальной задачей и остается читателям в качестве упражнения со звездочкой. Предлагается написать его в комментарии.

Задачи на эту идею:

Полный текст и комментарии »

  • Проголосовать: нравится
  • +61
  • Проголосовать: не нравится

Автор Stefan2417, история, 11 месяцев назад, По-русски

Всем привет!

Закончилась моя школьная карьера в соревновательном программировании, и я решил собрать список задач, которые понравились мне/помогли узнать что-то новое. Этот список находится в группе

Полный текст и комментарии »

  • Проголосовать: нравится
  • +71
  • Проголосовать: не нравится

Автор Stefan2417, история, 2 года назад, По-английски

Recently, a lot of accounts involved in mass cheating have started to appear:

kirya_molodec1 kirya_molodec2 kirya_molodec3 kirya_molodec4 kirya_molodec5 kirya_molodec6 kirya_molodec7 amaboss1 amaboss2 amaboss3 amaboss4 amaboss5 amaboss6 amaboss7

These accounts bypass the anti-plagiarism system by adding useless pieces of code and mixing it up. MikeMirzayanov Please improve the anti-plagiarism system.

Полный текст и комментарии »

  • Проголосовать: нравится
  • +69
  • Проголосовать: не нравится

Автор Stefan2417, история, 3 года назад, По-русски

Недавно мне пришло оповещение, что мое решение совпадает с решением FairyWinx в задаче С Codeforces Round 738 (Div. 2). Мне выдали предупреждение, а FairyWinx реджектнули посылки. Я считаю, что это какая-то ошибка и наше решения различаются не меньше, чем 2 случайно взятых по этой задаче. Я понимаю, что для человека раунд все-равно не рейтинговый, но прошу MikeMirzayanov восстановить посылки. Вот посылки: 125968739 125957836

Полный текст и комментарии »

  • Проголосовать: нравится
  • +30
  • Проголосовать: не нравится