后缀数组模板
Posted ws_yzy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了后缀数组模板相关的知识,希望对你有一定的参考价值。
2016.1.10
重新回味了一下后缀数组,还是太弱了……
描述一下代码中的个数组
cc数组 计数排序用
x[I] 表示 以i开头的后缀按第一关键字排序的排名
y[I] 表示 按第二关键字排序的排名为i的后缀开始的下标
height[I] 表示 suffix(sa[i])和 suffix(sa[i-1]) 的LCP
rank[i] 表示suffix(i) 的排名
#include<iostream>
#include<algorithm>
#include<cstdlib>
#include<cstdio>
#include<cstring>
#include<vector>
#include<cmath>
#include<complex>
#include<queue>
#define T 111111
using namespace std;
char s[T];
int t1[T],t2[T],cc[T],x[T],sa[T],rank[T],height[T];
int len;
bool cmp(int *y,int a,int b,int k)
int a1=y[a];
int b1=y[b];
int a2=a+k>=len ? -1:y[a+k];
int b2=b+k>=len ? -1:y[b+k];
return a1==b1 && a2==b2;
int make_sa()
int *x=t1,*y=t2;
int m=26;
for(int i=0; i<m; i++) cc[i]=0;
for(int i=0; i<len; i++) ++cc[x[i]=s[i]-'a'];
for(int i=1; i<m; i++) cc[i]+=cc[i-1];
for(int i=len-1; i>=0; i--) sa[--cc[x[i]]]=i;
for(int k=1; k<=len; k<<=1)
int p=0;
for(int i=len-k; i<len; i++) y[p++]=i;
for(int i=0; i<len; i++)
if( sa[i]>=k ) y[p++]=sa[i]-k;
for(int i=0; i<m; i++) cc[i]=0;
for(int i=0; i<len; i++) ++cc[x[y[i]]];
for(int i=1; i<m; i++) cc[i]+=cc[i-1];
for(int i=len-1; i>=0; i--) sa[--cc[x[y[i]]]]=y[i];
swap(x,y);
m=1; x[sa[0]]=0;
for(int i=1; i<len; i++)
x[sa[i]]=cmp(y,sa[i],sa[i-1],k) ? m-1:m++;
if( m>=len ) break;
void make_height()
for(int i=0; i<len; i++) rank[sa[i]]=i;
height[0]=0;
int k=0;
for(int i=0; i<len; i++)
if(!rank[i]) continue;
int j=sa[rank[i]-1];
if(k) k--;
while(s[i+k]==s[j+k]) k++;
height[rank[i]]=k;
int main()
scanf("%s",s);
len=strlen(s);
make_sa();
make_height();
for(int i=0; i<len; i++) cout << i; cout << endl;
for(int i=0; i<len; i++) cout << sa[i] << " "; cout << endl;
for(int i=0; i<len; i++) cout << height[i];
return 0;
以上是关于后缀数组模板的主要内容,如果未能解决你的问题,请参考以下文章