码迷,mamicode.com
首页 > 编程语言 > 详细

后缀数组SA

时间:2018-10-10 17:53:20      阅读:163      评论:0      收藏:0      [点我收藏+]

标签:int   cpp   aaa   pre   new   swa   []   har   build   

例如:输入s[]="aaa",输出sa[0]=2,sa[1]=1,sa[2]=0;

void build_sa(const char s[],int sa[])
{
    int m=128,n=strlen(s);
    int *x=new int[n],*y=new int[n],*c=new int[128];
    for (int i=0;i<m;++i)c[i]=0;
    for (int i=0;i<n;++i) c[x[i]=s[i]]++;
    for (int i=1;i<m;++i) c[i]+=c[i-1];
    for (int i=n-1;i>=0;--i) sa[--c[x[i]]]=i;

    for (int k=1;k<=n;k<<=1)
    {
        int p=0;
        for (int i=n-1;i>=n-k;--i) y[p++]=i;
        for (int i=0;i<n;++i) if(sa[i]>=k) y[p++]=sa[i]-k;

        for (int i=0;i<m;++i) c[i]=0;
        for (int i=0;i<n;++i) c[x[i]]++;
        for (int i=1;i<m;++i) c[i]+=c[i-1];
        for (int i=n-1;i>=0;--i) sa[--c[x[y[i]]]]=y[i];

        swap (x,y);
        p=1,x[sa[0]]=0;
        for(int 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++;
        m=p;
    }
    delete[] x,y,c;
}

后缀数组SA

标签:int   cpp   aaa   pre   new   swa   []   har   build   

原文地址:https://www.cnblogs.com/maoruimas/p/9767930.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!