Итак, вот решение, которое я могу предложить вам.Сложности даже ниже, чем те, о которых они вас просили, но это может показаться немного сложным.
Структура данных, в которой вы сохраняете все строки, будет Trie или даже Патриция дерево .В этом дереве для каждой строки вы хотите вставить минимальный циклический сдвиг (т.е. циклический сдвиг всех возможных, который является минимальным лексикографически) из всех его возможных сдвигов.Вы можете рассчитать минимальный циклический сдвиг строки в линейном времени, и я дам одно возможное решение этого чуть позже.На данный момент давайте предположим, что вы можете сделать это.Вот как будут реализованы требуемые операции:
- Init () - init как дерева trie, так и дерева patricia является постоянным - здесь нет проблем
- Insert (s) - вы вычисляетеминимальный циклический сдвиг s 's в O (| s |), а затем вы вставляете его в любую из структур данных в O (| s' |) = O (| s |).Это даже лучше, чем требуемая сложность
- Search_cyclic (s) - снова вы вычисляете минимальный циклический сдвиг s в O (| s |) и затем проверяете в Патрисии или Три, если строка присутствует,что снова делается в O (| s |)
Также сложность памяти такая же, как требуется, и может быть даже ниже, если вы создаете Патрицию.
Так что все, что осталось, этообъяснить, как найти минимальный циклический сдвиг.Поскольку вы упоминаете суффиксное дерево, я надеюсь, что вы знаете, как его построить за линейное время .Итак, хитрость в том, что вы добавляете свою строку s к себе (т.е. удваиваете ее), а затем создаете дерево суффиксов для удвоенной строки.Это все еще линейно относительно | s |так что никаких проблем нет.После этого все, что вам нужно сделать, это найти минимум суффиксов длины n в этом дереве.Я полагаю, что это совсем не сложно - начинайте с корня и всегда переходите по ссылке с текущего узла, на котором написана минимальная строка, пока вы не наберете длину больше, чем | s |.Из-за удвоения строки вы всегда сможете следовать минимальным строковым ссылкам, пока не наберете длину не менее | s |.
Надеюсь, этот ответ поможет.