您的位置:首页 > 其它

后缀数组模板一份

2014-05-29 20:27 246 查看
1 /******************
2 by zhuyuqi *
3 QQ:1113865149 *
4 name:2-sat *
5 *
6 ******************/
7
8 using namespace std;
9 const int MAX = 1000;
int r[MAX],*rank;
int wa[MAX],wb[MAX],ws[MAX],wv[MAX];
int height[MAX];
char str[MAX];
int cmp(int *r,int a,int b,int d) {
return r[a]==r[b]&&r[a+d]==r[b+d];
}

void build_sa(int *r,int *sa,int n,int m) {
int *x=wa,*y=wb,*t;
for(int i=0;i<m;i++) ws[i]=0;
for(int i=0;i<n;i++) ws[x[i]=r[i]]++;
for(int i=1;i<m;i++) ws[i]+=ws[i-1];

for(int i=0,j=1,p=1;p<n;j*=2,m=p) {
for(i=n-j,p=0;i<n;i++) y[p++]=i;
for(i=0;i<n;i++) if(sa[i]>=j) y[p++]=sa[i]-j;
for(i=0;i<n;i++) wv[i]=x[y[i]];

for(i=0;i<m;i++) ws[i]=0;
for(i=0;i<n;i++) ws[wv[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];

for(p=1,i=1,t=x,x=y,y=t,x[sa[0]]=0;i<n;i++)
x[sa[i]]=cmp(y,sa[i-1],sa[i],j)?p-1:p++;

}

return ;
}

void getHight(int *r,int *sa,int n) { //two - point
int h=0;
for(int i=0;i<n;i++) rank[sa[i]]=i;
for(int i=0;i<n;i++) {
if(h) h--;
int j=sa[rank[i]-1];
while(str[i+h]==str[j+h]) h++;
height[rank[i]]=h;
}
}

int main() {
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: