Para encontrar toda la subcadena de repetición en una cadena dada

Me he encontrado con una pregunta de entrevista: para encontrar todas las subcadenas de repetición en una cadena dada con un tamaño mínimo de 2. El algoritmo debe ser eficiente.

El código para la pregunta anterior se proporciona a continuación, pero no es eficiente.

<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>

Mi pregunta es que, ¿existe alguna estructura de datos que pueda implementar la pregunta anterior en la complejidad de tiempo de O (N)?

Si su respuesta es Árbol de sufijo o Hashing, por favor elaborela.

Respuestas a la pregunta(3)

Su respuesta a la pregunta