Фрактальне розширення#13044

Фрактальне розширення (Розбір)

Розв'язання

Кожен рядок, який може виникнути під час процесу, є префіксом рядка .

Нехай — мінімальна вартість, необхідна для отримання префікса довжини .

Спочатку

dp[0]=0.

З кожного стану існує два можливих переходи.

Додавання одного символу

Нехай поточний префікс має довжину .

Після додавання наступного символу його довжина стане рівною x+1, а вартість операції дорівнює x+1.

Отже,

dp[x+1] = \min(dp[x+1],dp[x]+x+1).

Застосування перетворення

Нехай поточний рядок має вигляд

s=t_1t_2\dots t_x.

Позначимо

L_x=|f(s)|.

Кожен символ A перетворюється на два символи, а кожен символ B — на один.

Тому

L_x=x+\#A(t_1t_2\dots t_x).

Після застосування операції рядок стає

s+f(s),

а його нова довжина дорівнює

x+L_x.

Операція є допустимою рівно тоді, коли

t_{x+1}t_{x+2}\dots t_{x+L_x} = f(t_1t_2\dots t_x).

Тепер побудуємо рядок

U=f(t).

Оскільки перетворення застосовується до кожного символу незалежно,

f(t_1t_2\dots t_x)

є рівно префіксом довжини L_x.

Отже, потрібно лише перевірити

t_{x+1}t_{x+2}\dots t_{x+L_x} = U_1U_2\dots U_{L_x}.

Це запит на довжину найбільшого спільного префікса між та суфіксом , який починається з позиції x+1.

Побудуємо рядок

U+\#+t,

де # — символ, відмінний від A та B, і порахуємо його Z-функцію.

Значення Z-функції у позиції, що відповідає x+1 у рядку , дорівнює довжині спільного префікса між та

t_{x+1}t_{x+2}\dots.

Таким чином, операцію можна виконати рівно тоді, коли

x+L_x\le n

та відповідне значення Z-функції не менше за L_x.

У такому випадку виконуємо перехід

dp[x+L_x] = \min(dp[x+L_x],dp[x]+c).

Відповіддю буде .

Доведення коректності

Кожен досяжний рядок є префіксом , тому достатньо зберігати лише його довжину.

З префікса довжини можливі рівно дві операції: додати один символ або застосувати перетворення.

Перший перехід динаміки точно відповідає операції додавання символу.

Для другого переходу Z-функція точно перевіряє, чи знаходиться f(t_1t_2\dots t_x) безпосередньо після поточного префікса.

Отже, ми враховуємо всі допустимі переходи та не додаємо жодного недопустимого.

Тому містить мінімальну вартість отримання префікса довжини , а є шуканою відповіддю.

Складність

Довжина рядка не перевищує .

Побудова , підрахунок кількості символів A у префіксах та обчислення Z-функції займають часу.

Кожен стан динаміки має не більше двох переходів.

Отже, загальна складність становить

за часом та

за пам'яттю.