后缀数组

// SuffixArray
void InitSa(char tex[],int sa[]){
    const int len=strlen(tex);
    int code[len],amt[ABSIZE];
    int subsa[len],cardn;
    for(int i=0;i<len;i++)
    { code[i]=tex[i]-'a'; amt[code[i]]++; }
    for(int i=1;i<len;i++)
    { amt[i]+=amt[i-1]; }
    for(int i=len-1;i>=0;i--)
    { sa[--amt[i]]=i; }
    for(int k=1,cardn=ABSIZE;k<n;k<<=1){
        for(int i=n-k;i<n;i++)
        {subsa[i-(n-k)+1]=i;}
        for(int i=0,j=k;i<len;i++)
        {if(sa[i]>=k) subsa[i+j]=sa[i]-k;}
        memset(amt,0,sizeof(amt));
        for(int i=0;i<len;i++)
        { amt[code[i]]++; }
        for(int i=1;i<cardn;i++) amt[i]+=amt[i-1];
        for(int i=len-1;i>=0;i--)
        { sa[--amt[code[subsa[i]]]]=subsa[i]; }    
        cardn=0; int tcode[ABSIZE]={0};
        for(int i=1;i<len;i++){
            tcode[sa[i]]=code[sa[i-1]]==code[sa[i]] 
              && code[subsa[i-1]]==code[subsa[i]]?cardn:++cardn;
            memcpy(code,tcode,len*sizeof(int)); cardn++;
            if(cardn>=len) break;
        }
    }
}

  

posted on 2013-08-13 10:08  Amyc  阅读(192)  评论(0编辑  收藏  举报