现在的位置: 首页 > 综合 > 正文

后缀数组

2017年10月16日 ⁄ 综合 ⁄ 共 885字 ⁄ 字号 评论关闭

这个星期写了后缀数组,具体是参考

http://wenku.baidu.com/link?url=9yE_Qn-Toh9IvB4fR7OqU8xJ3WSXsKX6RO4BDJeOxnENE4AT3Jx0uQqoSyNrF8gZTI9fcfiMNksmX3LCFt1FLK0ogZnQ2XNhjbGtxNzOmRW

后缀排序

void suffix_sort(){
	static int wx[maxn],wy[maxn],wv[maxn],ws[maxn];
	m='z'+1; ++n; int i,*x=wx,*y=wy;
	for (i=0;i<n;++i) ++ws[x[i]=s[i]];
	for (i=1;i<m;++i) ws[i]+=ws[i-1];
	for (i=n-1;i>=0;--i) sa[--ws[x[i]]]=i;
	for (int len=1,p=0;p<n;len<<=1,m=p){
		for (p=0,i=n-len;i<n;++i) y[p++]=i;
		for (i=0;i<n;++i) if (sa[i]>=len) y[p++]=sa[i]-len;
		for (i=0;i<m;++i) ws[i]=0;
		for (i=0;i<n;++i) ++ws[wv[i]=x[y[i]]];
		for (i=1;i<m;++i) ws[i]+=ws[i-1];
		for (i=n-1;i>=0;--i) sa[--ws[wv[i]]]=y[i];  // x is rank
		for (swap(x,y),p=1,x[sa[0]]=0,i=1;i<n;++i)
			x[sa[i]]=cmp(y,sa[i-1],sa[i],len)?p-1:p++;   // y is rank 
	}
	for (int i=0;i<n;++i) rank[i]=x[i];
}

求height

void get_height(){
	int len=0;
	for (int i=0;i<n-1;height[rank[i++]]=len)
		for (len?--len:0,j=sa[rank[i]-1];s[i+len]==s[j+len];++len);
}

刷过的一些题,就是论文上的那些题,还有一些水题

抱歉!评论已关闭.