После некоторого чтения я понял, что представляет собой массив суффикса и массив LCP.
Суффикс-массив. Представляет _lexicographic ранг каждого суффикса массива.
массив LCP. Содержит совпадение максимального префикса длины между двумя последовательными суффиксами после их сортировки лексикографически.
Я пытаюсь понять через пару дней, как точно работает массив суффикса и LCP.
Вот код, который берется из Codeforces:
/*
Suffix array O(n lg^2 n)
LCP table O(n)
*/
#include <cstdio>
#include <algorithm>
#include <cstring>
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
Я не могу, просто не могу понять, как работает этот алгоритм. Я попытался использовать пример с помощью карандаша и бумаги и написал шаги, связанные с этим, но потерял связь между ними как слишком сложную для меня, по крайней мере.
Любая помощь в отношении объяснения, используя пример, возможно, высоко ценится.