[Це питання є подальшим кроком для обчислення прогонів рядка ]
Період
p
рядкаw
- це будь-яке додатне ціле числоp
, якеw[i]=w[i+p]
визначається щоразу , коли обидві сторони цього рівняння визначаються. Нехайper(w)
позначають розмір найменшого періодуw
. Ми говоримо, що рядокw
є періодичним iffper(w) <= |w|/2
.
Тому неофіційно періодична рядок - це лише рядок, який складається з іншої рядка, повтореної хоча б раз. Єдине ускладнення полягає в тому, що в кінці рядка нам не потрібна повна копія повторного рядка, доки він повторюється в повному обсязі хоча б один раз.
Для прикладу розглянемо рядок x = abcab
. per(abcab) = 3
як x[1] = x[1+3] = a
, x[2]=x[2+3] = b
і менший період не існує. Тому рядок не abcab
є періодичним. Однак рядок ababa
є періодичним як per(ababa) = 2
.
Чим більше прикладів, abcabca
, ababababa
і abcabcabc
також є періодичними.
Для тих, хто любить регулярні вирази, цей визначає, чи є рядок періодичним чи ні:
\b(\w*)(\w+\1)\2+\b
Завдання полягає в тому, щоб знайти всі максимальні періодичні підрядки у більш тривалому рядку. Їх іноді в літературі називають пробіжками .
Підрядка
w
- це максимальна періодична підрядка (виконання), якщо вона є періодичною і ні,w[i-1] = w[i-1+p]
ніw[j+1] = w[j+1-p]
. Неофіційно "запуск" не може міститися в більшій кількості "запуску" з тим самим періодом.
Оскільки два запуски можуть представляти один і той же рядок символів, що зустрічаються в різних місцях загальної рядка, ми будемо представляти прогони по інтервалах. Ось вищеописане визначення, повторене в інтервалах.
Виконання (або максимальна періодична підрядка) у рядку
T
- це інтервал[i...j]
зj>=i
таким, що
T[i...j]
- це періодичне слово з періодомp = per(T[i...j])
- Це максимально. Формально ні, ні
T[i-1] = T[i-1+p]
ніT[j+1] = T[j+1-p]
. Неофіційно запуск не може міститись у більшій програмі з тим самим періодом.
Позначимо RUNS(T)
набором прогонів у рядку T
.
Приклади пробіжок
Чотири максимальні періодичні підрядка (біжить) в рядку
T = atattatt
єT[4,5] = tt
,T[7,8] = tt
,T[1,4] = atat
,T[2,8] = tattatt
.Рядок
T = aabaabaaaacaacac
містить наступні 7 максимальних періодичних підрядка (запускається):T[1,2] = aa
,T[4,5] = aa
,T[7,10] = aaaa
,T[12,13] = aa
,T[13,16] = acac
,T[1,8] = aabaabaa
,T[9,15] = aacaaca
.Рядок
T = atatbatatb
містить наступні три запуски. Вони єT[1, 4] = atat
,T[6, 9] = atat
іT[1, 10] = atatbatatb
.
Тут я використовую 1-індексацію.
Завдання
Напишіть код так, щоб на кожне ціле число n, починаючи з 2, виводили найбільшу кількість запусків, що містяться в будь-якому двійковому рядку довжини n
.
Оцінка
Ваш бал - це найвищий результат, який n
ви досягаєте за 120 секунд, так що для всіх k <= n
ніхто більше не опублікував правильну відповідь, ніж ви. Зрозуміло, що якщо у вас є всі оптимальні відповіді, ви отримаєте бал за найвищий розмір, який n
ви опублікували. Однак, навіть якщо ваша відповідь не є оптимальною, ви все одно можете отримати бал, якщо ніхто більше не може його перемогти.
Мови та бібліотеки
Ви можете використовувати будь-яку доступну мову та бібліотеки, які вам подобаються. Там, де це можливо, було б добре запустити свій код, тому, будь-ласка, включіть повне пояснення, як запустити / скомпілювати свій код в Linux, якщо це можливо.
Приклад optima
У наступному: n, optimum number of runs, example string
.
2 1 00
3 1 000
4 2 0011
5 2 00011
6 3 001001
7 4 0010011
8 5 00110011
9 5 000110011
10 6 0010011001
11 7 00100110011
12 8 001001100100
13 8 0001001100100
14 10 00100110010011
15 10 000100110010011
16 11 0010011001001100
17 12 00100101101001011
18 13 001001100100110011
19 14 0010011001001100100
20 15 00101001011010010100
21 15 000101001011010010100
22 16 0010010100101101001011
Що саме повинен виводити мій код?
Кожен n
ваш код повинен виводити один рядок і кількість запусків, які він містить.
My Machine Часи синхронізуються на моїй машині. Це стандартна установка ubuntu на восьмиядерний процесор AMD FX-8350. Це також означає, що мені потрібно мати можливість запускати ваш код.
Провідні відповіді
- 49 Андерс Kaseorg в C . Одинарна різьба та працює з L = 12 (2 Гб оперативної пам’яті).
- 27 по cdlane в C .
{0,1}
рядки, будь ласка, прямо вказати це. Інакше алфавіт може бути нескінченним, і я не бачу, чому ваші тестові вітрини повинні бути оптимальними, бо, здається, ви шукали і лише {0,1}
рядки.
n
до, 12
і він ніколи не бив бінарного алфавіту. Евристично я би очікував, що двійковий рядок повинен бути оптимальним, оскільки додавання більшої кількості символів збільшує мінімальну довжину пробігу.