Суффиксный алгоритм массива

После долгого чтения я выяснил, что представляет собой массив суффиксов и массив LCP.

Суффиксный массив: Представляет _lexicographic ранг каждого суффикса массива.

Массив LCP : Содержит соответствие префикса максимальной длины между двумя последовательными суффиксами после того, как ониотсортировано лексикографически.

Я несколько дней пытался понять, как именносуффиксный массив и алгоритм LCP работает.

Вот код, который взят изCodeforces:

/*
Suffix array O(n lg^2 n)
LCP table O(n)
*/
#include 
#include 
#include 

using namespace std;

#define REP(i, n) for (int i = 0; i < (int)(n); ++i)

namespace SuffixArray
{
    const int MAXN = 1 < 21;
    char * S;
    int N, gap;
    int sa[MAXN], pos[MAXN], tmp[MAXN], lcp[MAXN];

    bool sufCmp(int i, int j)
    {
        if (pos[i] != pos[j])
            return pos[i] < pos[j];
        i += gap;
        j += gap;
        return (i < N && j < N) ? pos[i] < pos[j] : i > j;
    }

    void buildSA()
    {
        N = strlen(S);
        REP(i, N) sa[i] = i, pos[i] = S[i];
        for (gap = 1;; gap *= 2)
        {
            sort(sa, sa + N, sufCmp);
            REP(i, N - 1) tmp[i + 1] = tmp[i] + sufCmp(sa[i], sa[i + 1]);
            REP(i, N) pos[sa[i]] = tmp[i];
            if (tmp[N - 1] == N - 1) break;
        }
    }

    void buildLCP()
    {
        for (int i = 0, k = 0; i < N; ++i) if (pos[i] != N - 1)
        {
            for (int j = sa[pos[i] + 1]; S[i + k] == S[j + k];)
            ++k;
            lcp[pos[i]] = k;
            if (k)--k;
        }
    }
} // end namespace SuffixArray

Ответы на вопрос(1)

Ваш ответ на вопрос