蒙蔽,先背着,说不定哪天就开窍了。
半年后,真的自己开不了窍,还是得有人讲才能明白些。
于是我先记录一下我对于后缀数组的理解吧。
算了还是写在代码注释中吧。。。
我后悔了,写在代码中之后复制过来会乱码,贴张图片吧。
——代码
#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; }