后缀数组模板

jys posted @ Jul 21, 2013 08:11:42 PM in 未分类 , 979 阅读

 

#include <cstdio>
#include <cstdlib>
#include <cstring>
#define NN 100001
int rank[NN],n,sum[NN];
int sa[NN],str[NN];
int trank[NN]={0},tsa[NN]={0};
void sort(int k)
{
	memset(sum,0,sizeof(sum));
	int i;
	for(i=1;i<=n;i++)sum[rank[i+k]]++;
	for(i=1;i<=n;i++)sum[i]+=sum[i-1];
	for(i=1;i<=n;i++)trank[i]=sum[rank[i+k]]--;
	for(i=1;i<=n;i++)tsa[trank[i]]=i;
	
	memset(sum,0,sizeof(sum));
	for(i=1;i<=n;i++)sum[rank[i]]++;
	for(i=1;i<=n;i++)sum[i]+=sum[i-1];
	for(i=n;i>=1;i--)trank[tsa[i]]=sum[rank[tsa[i]]]--;
	for(i=1;i<=n;i++)sa[trank[i]]=i;
	
	trank[sa[1]]=1;
	for(i=2;i<=n;i++)
		if(rank[sa[i]]!=rank[sa[i-1]]||rank[sa[i]+k]!=rank[sa[i-1]+k])
			trank[sa[i]]=trank[sa[i-1]]+1;
		else trank[sa[i]]=trank[sa[i-1]];
	for(i=1;i<=n;i++)rank[i]=trank[i];
}
int main()
{
	scanf("%d",&n);
	int i,k;for(i=1;i<=n;i++)scanf("%d",&str[i]);
	for(i=1;i<=n;i++)sum[str[i]]++;
	for(i=1;i<=n;i++)sum[i]+=sum[i-1];
	for(i=1;i<=n;i++)rank[i]=sum[str[i]-1]+1;
	for(k=1;2*k<=n;k<<=1)sort(k);
	for(i=1;i<=n;i++)sa[rank[i]]=i;
}

登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter