关于后缀数组的问题
  • 板块学术版
  • 楼主chenyilei
  • 当前回复4
  • 已保存回复4
  • 发布时间2020/11/8 16:54
  • 上次更新2023/11/5 08:27:36
查看原帖
关于后缀数组的问题
21001
chenyilei楼主2020/11/8 16:54

	void SA(char *s, int *sa, int *rank, int n, int m) {
		int ws[1000005], t[1000005], *x = rank, *y = t;
		for (int i = 0; i < m; ++i) ws[i] = 0;
		for (int i = 1; i <= n; ++i) ++ws[x[i] = s[i]];
		for (int i = 1; i < m; ++i) ws[i] += ws[i - 1];
		for (int i = n; i >= 1; --i) sa[ws[x[i]]--] = i;
		for (int l = 1, p = 1; p < n; l <<= 1, m = p) {
			p = 0;
			for (int i = n - l + 1; i <= n; ++i) y[++p] = i;
			for (int i = 1; i <= n; ++i) if (sa[i] > l) y[++p] = sa[i] - l;
			for (int i = 0; i < m; ++i) ws[i] = 0;
			for (int i = 1; i <= n; ++i) ++ws[x[i]];
			for (int i = 1; i < m; ++i) ws[i] += ws[i - 1];
			for (int i = n; i >= 1; --i) sa[ws[x[y[i]]]--] = y[i];
			swap(x, y), p = 1, x[sa[1]] = 0;
			for (int i = 2; i <= n; ++i) {
			//	assert(sa[i - 1] + l <= n);
			//	assert(sa[i] + l <= n); 
				x[sa[i]] = y[sa[i - 1]] == y[sa[i]] && y[sa[i - 1] + l] == y[sa[i] + l] ? p - 1 : p++;    // 为什么很多代码这里都没有判数组越界
			}
		}
	}
2020/11/8 16:54
加载中...