Форум программистов, компьютерный форум, киберфорум
Python: Решение задач
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
0 / 0 / 0
Регистрация: 09.11.2023
Сообщений: 14

Найти префикс строки максимальной длины, являющийся ретрострокой

29.11.2024, 10:42. Показов 1956. Ответов 16

Студворк — интернет-сервис помощи студентам
S называется последовательность символов S1,...,Sn, где |S|=n — это длина строки S.

Для любого k (1≤k≤|S|) k-м префиксом строки S называется строка S1,...,Sk длины k. Если k<|S|, то префикс называется собственным.
Аналогично для любого k (1≤k≤|S|) k-м суффиксом строки S называется строка S|S|−k+1,...,S|S| длины k. Если k<|S|, то суффикс также называется собственным.

Назовём числом повторяемости строки S количество её различных собственных суффиксов, каждый из которых совпадает с префиксом той же длины, что и этот суффикс.

Назовём строку ретрострокой, если её число повторяемости строго больше чисел повторяемости всех её собственных префиксов.

Дана строка S. Нужно найти её префикс максимальной длины (не обязательно собственный), являющийся ретрострокой.

Входные данные
В первой строке входного файла записана строка S, 1≤|S|≤1000000. Строка содержит лишь символы с ASCII-кодом от 33 до 126.

Выходные данные
В первой строке выходного файла должен быть выведен префикс S максимальной длины, являющийся ретрострокой.

Примеры
Входные данные
z
Выходные данные
z
Входные данные
aabaabaaabaabaaabaaba
Выходные данные
aabaabaaabaabaa

Нужно оптимизировать задачу
Превышено ограничение времени на тесте 12 - 500 мс

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
def count_repeats(s):
    count = 0
    for i in range(1, len(s)):
        if s[:i] == s[-i:]:
            count += 1
    return count
 
s = input()
n = len(s)
max_len = 0
result = ""
 
for i in range(1, n + 1):
    prefix = s[:i]
    is_retro = True
    repeats_prefix = count_repeats(prefix)
    for j in range(1, i):
        if count_repeats(prefix[:j]) >= repeats_prefix:
            is_retro = False
            break
    if is_retro:
        max_len = i
        result = prefix
 
 
print(result)
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
29.11.2024, 10:42
Ответы с готовыми решениями:

Найти слово максимальной длины в одной строке и поменять со словом максимальной длины другой строки
Найти слово максимальной длины в одной строке и поменять со словом максимальной длины другой строки..Помогите реализовать с помощью типа...

Строки. Найти и вывести на экран слово максимальной длины
С клавиатуры вводится строка. Найти и вывечти на экран слово максимальной длины. словами считать любую последовательность символов...

Найти строку максимальной длины: ошибка при перезаписи строки strcpy
format PE Console entry start include 'win32a.inc' include 'DFLib.inc' section '.data' data readable writeable string_spec db...

16
Эксперт Python
 Аватар для Red white socks
4523 / 1899 / 336
Регистрация: 18.01.2021
Сообщений: 3,489
29.11.2024, 18:24
Объясните первый тест. Почему надо z выводить?
0
0 / 0 / 0
Регистрация: 09.11.2023
Сообщений: 14
29.11.2024, 18:30  [ТС]
строка z удовлетворяет определению ретростроки, и она является префиксом максимальной длины, который можно вывести, поэтому ответ на первый тест — z
0
Эксперт Python
 Аватар для Red white socks
4523 / 1899 / 336
Регистрация: 18.01.2021
Сообщений: 3,489
29.11.2024, 18:34
Цитата Сообщение от igor_vahroev Посмотреть сообщение
строка z удовлетворяет определению ретростроки
Её индекс равен нулю. Чем он удовлетворяет?
0
0 / 0 / 0
Регистрация: 09.11.2023
Сообщений: 14
29.11.2024, 18:47  [ТС]
Если длина строки S=1, то она всегда будет ретрострокой, так как не имеет собственных префиксов.
0
Эксперт Python
 Аватар для Red white socks
4523 / 1899 / 336
Регистрация: 18.01.2021
Сообщений: 3,489
29.11.2024, 19:06
Цитата Сообщение от igor_vahroev Посмотреть сообщение
Если длина строки S=1, то она всегда будет ретрострокой, так как не имеет собственных префиксов.
Из какого места в условии сделан такой вывод?
Индекс строки из одного символа равен нулю. Индекс пустой строки либо не определен, либо тоже ноль. И в том и в другом случае нельзя сказать, что отсутствие собственных префиксов делает строку с нулевым индексом ретрострокой.
Все это очень странно.
0
0 / 0 / 0
Регистрация: 09.11.2023
Сообщений: 14
29.11.2024, 19:18  [ТС]
Число повторяемости строки S (равное 0) строго больше числа повторяемости всех её собственных префиксов (пустое множество).

В условии задачи говорится, что 1≤∣S∣, а значит, пустая строка вообще не рассматривается. Таким образом, ситуация с её числом повторяемости или определением ретростроки не возникает.

Строка из одного символа всегда является ретрострокой, потому что:
У неё нет собственных префиксов.
Пустота множества чисел повторяемости собственных префиксов автоматически удовлетворяет условию строго больше.
0
Эксперт Python
 Аватар для Red white socks
4523 / 1899 / 336
Регистрация: 18.01.2021
Сообщений: 3,489
30.11.2024, 14:30
Цитата Сообщение от igor_vahroev Посмотреть сообщение
Пустота множества чисел повторяемости собственных префиксов автоматически удовлетворяет условию строго больше.
Автоматически ничего ничему не может удовлетворять.
Сравнивать вы можете только упорядоченные объекты. Например, целые числа между собой. Индекс повторяемости единичной строки равен нулю. Индекс повторяемости пустого множества/пустой строки, как вы сами выше заметили, не определён. Вы не можете ничего сравнивать с неопределенностью.

Добавлено через 6 минут
По самой задаче.
Научитесь вычислять индекс повторяемости через префикс-функцию.
Правда, полсекунды на миллион символов, для питона чересчур. На тестах в 1М символов мой комп укладывается в эти ограничения, но с трудом и он мощнее обычных тестирующих систем.
Возможно получится на PyPy или придется на С++ переписывать.
0
0 / 0 / 0
Регистрация: 09.11.2023
Сообщений: 14
01.12.2024, 15:48  [ТС]
Это не решение
0
Эксперт Python
 Аватар для Red white socks
4523 / 1899 / 336
Регистрация: 18.01.2021
Сообщений: 3,489
02.12.2024, 02:55
Я не вижу смысла в выкладывании своего решения. Хотел помочь прийти вам к нему самостоятельно. Если у вас нет желания его получить, то и у меня интереса тоже нет.
1
0 / 0 / 0
Регистрация: 09.11.2023
Сообщений: 14
02.12.2024, 10:37  [ТС]
У меня есть желание его получить, написал код c использованием префикс-функции, код не прошел тестирование, ограничение по времени, писал на PyPy
0
Эксперт Python
 Аватар для Red white socks
4523 / 1899 / 336
Регистрация: 18.01.2021
Сообщений: 3,489
02.12.2024, 21:49
Выложите, посмотрим чем можно помочь
0
0 / 0 / 0
Регистрация: 09.11.2023
Сообщений: 14
03.12.2024, 14:16  [ТС]
Попытался использовать кэш для оптимизации - программа все равно не прошла теста на время

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
def count_repeats(s):
    n = len(s)
    count = 0
    for i in range(1, n):
        if s[:i] == s[-i:]:
            count += 1
    return count
 
s = input()
n = len(s)
max_len = 0
result = ""
 
# Используем кэш для хранения числа повторяемости
repeats_cache = [0] * (n + 1)
 
for i in range(1, n + 1):
    prefix = s[:i]
    # Если число повторяемости для этого префикса ещё не вычислено, вычисляем его
    if repeats_cache[i] == 0:
        repeats_cache[i] = count_repeats(prefix)
    repeats_prefix = repeats_cache[i]
    is_retro = True
    for j in range(1, i):
        # Если число повторяемости для префикса prefix[:j] ещё не вычислено, вычисляем его
        if repeats_cache[j] == 0:
            repeats_cache[j] = count_repeats(s[:j])
        if repeats_cache[j] >= repeats_prefix:
            is_retro = False
            break
    if is_retro:
        max_len = i
        result = prefix
 
print(result)
0
Эксперт Python
 Аватар для Red white socks
4523 / 1899 / 336
Регистрация: 18.01.2021
Сообщений: 3,489
03.12.2024, 22:59
Не очень понял, где у уас префикс функции используется, но считается все не так.
Я сейчас на финале яндекс капа, возвращаюсь в пятницу, зашлю код, как надо
0
Эксперт Python
 Аватар для Red white socks
4523 / 1899 / 336
Регистрация: 18.01.2021
Сообщений: 3,489
06.12.2024, 11:36
Цитата Сообщение от igor_vahroev Посмотреть сообщение
написал код c использованием префикс-функции,
И где он???
0
0 / 0 / 0
Регистрация: 09.11.2023
Сообщений: 14
06.12.2024, 12:51  [ТС]
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
def compute_prefix_function(s):
    n = len(s)
    p = [0] * n
    for i in range(1, n):
        j = p[i - 1]
        while j > 0 and s[i] != s[j]:
            j = p[j - 1]
        if s[i] == s[j]:
            j += 1
        p[i] = j
    return p
 
def count_repeats_using_prefix_function(s):
    n = len(s)
    p = compute_prefix_function(s)
    repeats = [0] * (n + 1)
    for i in range(n):
        repeats[p[i]] += 1
    for i in range(n - 1, 0, -1):
        repeats[p[i - 1]] += repeats[i]
    for i in range(1, n + 1):
        repeats[i] += 1
    return repeats
 
def find_max_retro_string(s):
    n = len(s)
    p = compute_prefix_function(s)
    repeats = count_repeats_using_prefix_function(s)
    max_len = 0
    result = ""
    for i in range(1, n + 1):
        prefix_repeats = repeats[i]
        is_retro = True
        for j in range(1, i):
            if repeats[j] >= prefix_repeats:
                is_retro = False
                break
        if is_retro:
            max_len = i
            result = s[:i]
    return result
 
s = input().strip()
print(find_max_retro_string(s))
0
Эксперт Python
 Аватар для Red white socks
4523 / 1899 / 336
Регистрация: 18.01.2021
Сообщений: 3,489
06.12.2024, 18:14
Лучший ответ Сообщение было отмечено igor_vahroev как решение

Решение

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

Добавлено через 28 минут
Вот код, раз уж обещал
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
from functools import cache
 
def prefix_func(s):
    p = [0] * len(s)
    for i in range(1, len(s)):
        k = p[i - 1]
        while k > 0 and s[k] != s[i]:
            k = p[k - 1]
        if s[k] == s[i]:
            k += 1
        p[i] = k
    return p
 
@cache
def index_repeat(i):
    if pi[i] > 0:
        return 1 + index_repeat(pi[i]-1)
    return 0
 
s = "aabaabaaabaabaaabaaba"
pi = prefix_func(s)
current_max, max_ind = -1, -1
for i in range(len(s)):
    ind_repeat = index_repeat(i)
    if ind_repeat > current_max:
        current_max, max_ind = ind_repeat, i
print(s[:max_ind+1])
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
06.12.2024, 18:14
Помогаю со студенческими работами здесь

Найти подпоследовательность максимальной длины, которая входит в две данные строки
Найти подпоследовательность максимальной длины, которая входит в две данные строки, при условии, что можно вычеркнуть произвольное...

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

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

Общие строки максимальной длины
Два списка строк. Определить функцию, возвращающую список общих строк максимальной длины. (defun common-maximum-length-words (w ...

Поиск строки максимальной длины по критерию
Маленький Пафнутий недавно выучил буквы. Теперь он радостно пишет их в ряд в тетради. Написав достаточно большую строку, Пафнутий задумался...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru