126

(5 ответов, оставленных в Feedback)

В новой версии статьи постарался покрыть все эти вопросы. Жду ещё конструктивных замечаний smile

127

(10 ответов, оставленных в Feedback)

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

128

(2 ответов, оставленных в Algo)

Эм, там в статье несколько опущен случай неориентированного графа (добавил себе в TODO).

Вообще для неор графа надо немножко изменить алгоритм: навесить одну доп. проверку. А именно, в функцию dfs передавать вершину p - это номер вершины, по которой мы попали в v. Тогда внутри dfs в цикле перед всеми остальными проверками надо дописать проверку:

if (to == p)  continue;

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

Соответственно, при вызове dfs (to) мы теперь ещё передаём вершину p, т.е. вместо этого пишем dfs (to, v). В основной программе вызывать надо dfs (i, -1).

129

(8 ответов, оставленных в Offtopic)

Не знаю, может быть, так задетектилось.

130

(6 ответов, оставленных в Offtopic)

Почти год назад один из участников сообщества (с ником Banin) предложил сделать в Википедии раздел с упражнениями из Кормена "Алгоритмы: Построение и анализ". Предлагалось публиковать развёрнутые решения к упражнениям и задачам в этой книге.

Собственно, вот недавно мы решили заняться этой идеей вплотную. Ссылка на этот раздел Википедии: http://e-maxx.ru/wiki/Алгоритмы:_построение_и_анализ.

Пока этим разделом занимались только я и homo_sapiens (http://e-maxx.ru/wiki/Участник:Homo_sapiens). Мы успели сделать не очень много: всего пару десятков упражнений, но среди них уже много достаточно интересных и поучительных. В общем, предлагаю и Вам присоединиться к этому занятию smile

P.S. Напоминаю, что для этого Вы должны зарегистрироваться в Википедии этого сайта. При редактировании следуйте, пожалуйста, принятым правилам оформления! Для указания своего авторства вписывайте в заголовок "Решение (~~~)", и вместо трёх тильд вики автоматически подставит ссылку на Ваш профиль.

131

(4 ответов, оставленных в Feedback)

Да, кажется, это правильные исправления, хотя я не проверял на тестах...

Ой, как много ошибок... Спасибо.

133

(8 ответов, оставленных в Offtopic)

Обновил первый пост со статистикой.

134

(7 ответов, оставленных в News)

В целом, к концу года удалось обуздать нагрузку на сервер.

  • Ужесточил ограничение на нагрузку сервера с одного IP. Т.е. если вы начинаете долбить сайт своим wget'ом (и, например, это дало нагрузку в несколько процентов серверного процессора), то спустя несколько минут Вам перестанет показываться сам сайт, а будет выдаваться табличка "Сайт вызвал перегрузку процессора и закрыт". Для всех остальных людей в это время сайт будет по-прежнему доступен. Этот вид блокировки включается, если нагрузка с IP превысила 1% от мощности процессора.

  • Кстати, тариф сервера - 3.5% от мощности серверного процессора. При этом у меня в настройках стоит, что нагрузке разрешается доходить до 10% (типа поблажка со стороны хостера), и только при его превышении сайт будет временно отключаться для всех посетителей сразу.

  • Добавил кеширование в Википедии. Там есть магические настройки кеширования, про которые точно никто не может сказать, насколько сильно они помогают, но кеширование APC + файловое кеширование для анонимусов привело к тому, что нагрузка на сервер упала раза в 2-3. В общем, как я и предполагал, самое тормозное звено на сайте - MediaWiki.

  • А форум и код самого сайта даже не пришлось трогать - эта нагрузка оказалась не критической. Хотя вот думаю всё же реализовать файловое кеширование и на самом сайте, на всякий случай smile

135

(12 ответов, оставленных в Algo)

Oleg пишет:

Так тоже не получится.  разложить на простые и восстановить получится только если M "square-free".

А точно ли? Китайская теорема работает, даже когда модули не простые, главное - их взаимная простота.

Посчитаем ответ по каждому модулю pi_^qi, и запустим Гарнера.

Всё правильно, вы как раз заметили два связанных факта smile

Почему при нахождении ответа мы просто берём x[ i ] = d[ i ]? Потому что в моей реализации все c[ i ][ i ] = 1.

Почему они равны единице? Потому что я каждый раз сокращаю на c[ i ][ i ] всю строку, что вы и отметили вторым куском кода. Более логично было бы ещё дописать осле этого цикла a[ i ][ i ] = 1, но я этого не написал, просто потому что эти значения вообще больше нигде не будут использоваться.

Но, если угодно, можно убрать цикл сокращения, но тогда надо будет при нахождении ответа сделать деление на a[ i ][ i ], и ещё в самом гауссе при отнимании одной строки от другой надо будет текущую строку делить на a[ i ][ i ].

137

(12 ответов, оставленных в Algo)

Может быть, получится развить это?

Так же побьём всё на блоки длины P, а в каждом все числа сократим на gcd с P, от хвоста запустимся рекурсивно.

Но, как минимум, плохо то, что асимптотика серьёзно зависит P.

138

(2 ответов, оставленных в Algo)

Да, никак руки не дойдут. А старый LCP, который у меня описан, прибить надо smile

139

(4 ответов, оставленных в Problems)

Hack-Yer пишет:

И еще : откуда можно скачать последний MinGW, который сам всё автоматически установит? Гуглил уже два дня sad

http://sourceforge.net/projects/mingw/f … e/download

140

(2 ответов, оставленных в Algo)

Это деление v на 2 по модулю n (где n нечётно).
Если число v - и так чётное, то результат деления - просто v/2.
Если v - нечётное, то результатом будет (v+n)/2.

В самом деле, написано было очень неточно. Сейчас переписал это место (и заодно ещё внёс небольшие исправления в статью).

142

(3 ответов, оставленных в Algo)

Хотя это, наверное, странная уловка - ведь с точки зрения скрытой константы более информативно написать "log M" smile

143

(5 ответов, оставленных в Problems)

malloc (x) - выделить память длиной x байт, и вернуть указатель на эту память.
Это нужно, когда мы хотим использовать массив какого-то размера, но заранее не знаем этот размер. Либо когда нам надо создавать структуры какого-то типа, но мы заранее не знаем, сколько их будет, - тогда каждый экземпляр такой структуры будем создавать отдельным вызовом malloc'а.

assert(expr) - вычисляет значение выражения expr, и если оно = false, то падает с рантаймом.
Удобно для всякого рода отладок. В режиме компиляции Release обычно этот макрос сам переключается в режим, когда вообще ничего не делает.

144

(1 ответов, оставленных в Algo)

Вроде всё правильно. Массив P - содержит все степени заданного числа-основания хеша (P[ i ] - это константа P в степени i).

Речь там о том, что если мы подсчитаем хеши от всех префиксов H[ i ], то разность двух таких префиксных хешей H[ j ] - H[ i-1 ] даст хеш от подстроки S[i..j], но умноженный на P в степени i.

145

(6 ответов, оставленных в Problems)

про большой тест - смешно smile а какой четвертьфинал?

правильное решение - неявное декартово дерево. оно умеет обменивать два подмассива местами (даже не обязательно соседних). на сайте вроде более-менее описано это.

146

(2 ответов, оставленных в Problems)

Я правильно понял, что елей одного сорта можем сажать сколько угодно?

Мне кажется, решать можно так: динамика d[ i ][ j ], где i - текущая рассматриваемая клумба, j - номер последней клумбы, в которую посадили ель. Тогда есть два перехода: мы либо не сажаем в i никакую ель - тогда переходим в d[ i+1 ][ j ] с тем же значением, либо пытаемся посадить какую-нибудь ель в i - тогда перебираем номер k сорта ели, проверяем, что так мы не бросим тень на клумбу с номером j, и переходим в состояние d[ next ][ i ], где next - номер первой клумбы после правого конца тени текущей ели.

147

(4 ответов, оставленных в Problems)

Добавлю, что насколько я знаю, теория Шпрага-Гранди вообще не обобщается на случай игр в поддавки (misere по-английски). Вроде бы ним в поддавки - одна из немногих игр, для которых это удалось, да и то вон какое шаманство получается smile

Улучшил статью, - теперь сказано и про размер макс. парсоча (с наметками док-ва), и про нахождение самого паросочетания (хотя по-прежнему за не очень крутую асимптотику).

149

(1 ответов, оставленных в Feedback)

Спасибо. Есть такая у меня слабость - забываю ставить ссылки на книги/статьи smile
Буду стараться исправить это.

Окей, мне вчера тоже на почту написали об этом.

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

Спасибо.