Aby znaleźć wszystkie powtarzające się podciągi w danym ciągu

Ponownie natrafiam na pytanie wywiadu: Aby znaleźć wszystkie powtarzające się podciągi w danym ciągu o minimalnym rozmiarze 2. Algorytm powinien być skuteczny.

Kod dla powyższego pytania jest podany poniżej, ale nie jest skuteczny.

<code>#include <iostream>
#include <algorithm>
#include <iterator>
#include <set>
#include <string>

using namespace std;

int main()
{
    typedef string::const_iterator iterator;
    string s("ABCFABHYIFAB");
    set<string> found;

    if (2 < s.size())
        for (iterator i = s.begin() + 1, j = s.end(); i != j; ++i)
            for (iterator x = s.begin(); x != i; ++x)
            {
                iterator tmp = mismatch(i, j, x).second;;
                if (tmp - x > 1)
                    found.insert(string(x, tmp));
            }

            copy(found.begin(), found.end(),ostream_iterator<string>(cout, "\n"));
}
</code>

Moje pytanie brzmi: czy istnieje jakakolwiek struktura danych, która może zaimplementować powyższe pytanie w złożoności czasowej O (N)?

Jeśli odpowiedź brzmi drzewo przyrostkowe lub haszowanie, proszę je rozwinąć.

questionAnswers(3)

yourAnswerToTheQuestion