⚙️ Алгоритмы  ·  20 вопросов  ·  ~45 мин  ·  ⏱ Таймер 45:00  ·  Сложный  · 

Алгоритмы обработки строк

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

Отвечено: 0 из 20
⏱ --:--
0%
💡 Инструкция: Выбери один ответ из четырёх. В тесте 20 вопросов и 45 минут. После завершения откроются общий процент, четыре тематические шкалы, правильные ответы и пояснения.
Вопрос 1 из 20
Какое значение pi[4] для строки "ababa"?
Python
s = "ababa"
pi = [0] * len(s)
for i in range(1, len(s)):
    j = pi[i - 1]
    while j > 0 and s[i] != s[j]:
        j = pi[j - 1]
    if s[i] == s[j]:
        j += 1
    pi[i] = j
print(pi[4])
Вопрос 2 из 20
Какой массив pi получится для "aaaa"?
Python
s = 'aaaa'
pi = [0] * len(s)
for i in range(1, len(s)):
    j = pi[i - 1]
    while j > 0 and s[i] != s[j]:
        j = pi[j - 1]
    if s[i] == s[j]:
        j += 1
    pi[i] = j
print(pi)
Вопрос 3 из 20
Что означает pi[i]?
Вопрос 4 из 20
К какому j нужно откатиться при несовпадении?
Python
i = current_text_position
j = matched_prefix_length
while j > 0 and text[i] != pattern[j]:
    j = ...
if text[i] == pattern[j]:
    j += 1
# Нужно выбрать выражение вместо многоточия.
Вопрос 5 из 20
Строка длины n имеет период p=n−pi[n−1]. Когда она полностью состоит из повторов блока длины p?
p=n-\pi_{n-1},\quad n\bmod p=0
Вопрос 6 из 20
На каком индексе начинается первое совпадение?
Python
text = "ababcababa"
pattern = "ababa"
print(text.find(pattern))
Вопрос 7 из 20
Как вычислить начало найденного шаблона в KMP?
Python
for i, char in enumerate(text):
    while j > 0 and char != pattern[j]:
        j = prefix[j - 1]
    if char == pattern[j]:
        j += 1
    if j == len(pattern):
        start = ...
        occurrences.append(start)
        j = prefix[j - 1]
Вопрос 8 из 20
Почему KMP работает за O(n+m)?
Вопрос 9 из 20
Какой дефект у наивного поиска?
Python
def find_first(text, pattern):
    for start in range(len(text) - len(pattern)):
        if text[start:start + len(pattern)] == pattern:
            return start
    return -1
Вопрос 10 из 20
Как искать шаблон через Z-функцию одной строки?
Вопрос 11 из 20
Как получить хеш подстроки [l,r) из префиксных хешей в простой схеме?
Python
def substring_hash(left, right, prefix, powers, base, mod):
    # prefix[i] — хеш s[:i] по схеме
    # prefix[i + 1] = (prefix[i] * base + code(s[i])) % mod
    length = right - left
    return ...

# Нужно выбрать выражение вместо многоточия.
Вопрос 12 из 20
Почему после вычитания берут % mod?
Python
value = (prefix[right] - prefix[left] * powers[right-left]) % mod
Вопрос 13 из 20
Что означает совпадение двух одиночных хешей?
Вопрос 14 из 20
Как надёжнее обработать совпавшие хеши в системе, где ошибка недопустима?
Python
def definitely_equal(a, b):
    hash_a = polynomial_hash(a)
    hash_b = polynomial_hash(b)
    if hash_a != hash_b:
        return False
    # Нужно выбрать надёжную заключительную проверку.
    return ...

result = definitely_equal(first_text, second_text)
Вопрос 15 из 20
Зачем заранее вычислять степени p?
H(l,r)=pref_r-pref_l\,p^{r-l}
Вопрос 16 из 20
Каково расстояние Левенштейна между "cat" и "cut"?
Python
a = 'cat'
b = 'cut'
dp = [[0] * (len(b) + 1) for _ in range(len(a) + 1)]

for i in range(len(a) + 1):
    dp[i][0] = i
for j in range(len(b) + 1):
    dp[0][j] = j

for i in range(1, len(a) + 1):
    for j in range(1, len(b) + 1):
        cost = 0 if a[i - 1] == b[j - 1] else 1
        dp[i][j] = min(dp[i - 1][j] + 1,
                       dp[i][j - 1] + 1,
                       dp[i - 1][j - 1] + cost)
print(dp[-1][-1])
Вопрос 17 из 20
Какой переход используется при совпадающих последних символах?
Python
if a[i - 1] == b[j - 1]:
    dp[i][j] = ...
Вопрос 18 из 20
С какой соседней ячейкой связана операция удаления символа из a?
Вопрос 19 из 20
Как инициализировать первую строку и столбец таблицы?
Python
def edit_distance(a, b):
    dp = [[0] * (len(b) + 1) for _ in range(len(a) + 1)]

    # Здесь нужно заполнить dp[i][0] и dp[0][j],
    # прежде чем считать остальные клетки.

    for i in range(1, len(a) + 1):
        for j in range(1, len(b) + 1):
            cost = 0 if a[i - 1] == b[j - 1] else 1
            dp[i][j] = min(dp[i - 1][j] + 1,
                           dp[i][j - 1] + 1,
                           dp[i - 1][j - 1] + cost)
    return dp[-1][-1]
Вопрос 20 из 20
Что дополнительно нужно хранить для восстановления последовательности операций?
dp_{i,j}=\min\{del,ins,sub\}

Ответьте на все 20 вопросов, чтобы получить результат

🔗 Встроить тест на свой сайт (iframe) ▼

Скопируйте код и вставьте в любое место на вашем сайте:

Также доступна прямая ссылка на embed-страницу