后缀数组

模板题

 

蒙蔽,先背着,说不定哪天就开窍了。

 

半年后,真的自己开不了窍,还是得有人讲才能明白些。

于是我先记录一下我对于后缀数组的理解吧。

算了还是写在代码注释中吧。。。

我后悔了,写在代码中之后复制过来会乱码,贴张图片吧。

 

——代码

#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;
} 

  

 

 

有关后缀数组的讲解

posted @ 2017-06-09 17:46  zht467  阅读(99)  评论(0编辑  收藏  举报