后缀数组
蒙蔽,先背着,说不定哪天就开窍了。
半年后,真的自己开不了窍,还是得有人讲才能明白些。
于是我先记录一下我对于后缀数组的理解吧。
算了还是写在代码注释中吧。。。
我后悔了,写在代码中之后复制过来会乱码,贴张图片吧。
——代码
#include <cstdio>
#include <cstring>
#include <iostream>
#define N 1100001
using namespace std;
int n, m = 'z' + 1;
char s[N];
int x[N], y[N], b[N], sa[N];
inline void build_sa()
{
int i, k, p;
n = strlen(s);
for(i = 0; i < m; i++) b[i] = 0;
for(i = 0; i < n; i++) b[x[i] = s[i]]++;
for(i = 1; i < m; i++) b[i] += b[i - 1];
for(i = n - 1; i >= 0; i--) sa[--b[x[i]]] = i;
for(k = 1; k <= n; k <<= 1)
{
p = 0;
for(i = n - k; i < n; i++) y[p++] = i;
for(i = 0; i < n; i++) if(sa[i] >= k) y[p++] = sa[i] - k;
for(i = 0; i < m; i++) b[i] = 0;
for(i = 0; i < n; i++) b[x[y[i]]]++;
for(i = 1; i < m; i++) b[i] += b[i - 1];
for(i = n - 1; i >= 0; i--) sa[--b[x[y[i]]]] = y[i];
swap(x, y);
p = 1, x[sa[0]] = 0;
for(i = 1; i < n; i++)
x[sa[i]] = y[sa[i - 1]] == y[sa[i]] && y[sa[i - 1] + k] == y[sa[i] + k] ? p - 1 : p++;
if(p >= n) break;
m = p;
}
}
int main()
{
int i;
scanf("%s", s);
build_sa();
for(i = 0; i < n; i++) printf("%d ", sa[i] + 1);
return 0;
}


浙公网安备 33010602011771号