Здравствуйте, Chriso, Вы писали:
C>2. Дан список последовательностей чисел C>Найти самую часто встречающуюся непрерывную подпоследовательность и сколько раз она встречается. C>Облегчённый вариант, с которым я также не справился: длина подпоследовательности задана, рассматривать только подпоследовательности этой длины. C>Очевидное решение с Dictionary, где ключом является сама подпоследовательность не подходит по требуемой памяти, даже в "облегчённом" варианте. Предполагается, что список читается из файла и в память не влезет.
C>Пример: C>вход [[1, 2, 3, 4], [4, 2, 3, 1]] C>выход [2, 3], 2
C>вход [[1, 2, 3, 4], [4, 2, 3, 2, 3]] C>выход [2, 3], 3
Думаю, так:
Надо объединить все входящие последовательности в одну большую, заменяя промежутки между последовательностями специальным символом ($).
Теперь у нас стоит задача поиска наиболее часто повторяющейся подстроки в строке.
Для этого нужно построить суффиксное дерево (что само по себе не просто).
При построении дерева нужно для каждого узла запоминать количество его вхождений в строку.
Потом найти в дереве наиболее глубокий узел по количеству символов, считая от корня. Это и будет ответ.
P.S. Да уж, задачи — жесть. В условиях малого времени сделать сложно