美文网首页
Suffix Array

Suffix Array

作者: fo0Old | 来源:发表于2018-01-27 01:08 被阅读0次
    struct SuffixArray
    {
        int id;ll rk;
        bool operator<(const SuffixArray &b)const
        {
            return rk<b.rk;
        }
    }sa[__];
    
    //rk[i]: s[i…n]的排名
    //sa[i].id: 第i名为s[sa[i].id…n]
    template<class T>
    void get_sa(T s[],int n,int rk[])
    {
        for(int i=1;i<=n;i++)
            sa[i].id=i,sa[i].rk=s[i];
        for(int i=1;;i<<=1)
        {
            sort(sa+1,sa+1+n);
            for(int j=1;j<=n;j++)
            {
                rk[sa[j].id]=rk[sa[j-1].id];
                if(sa[j].rk!=sa[j-1].rk)
                    rk[sa[j].id]++;
            }
            if(rk[sa[n].id]==n)break;
            for(int j=1;j<=n;j++)
            {
                sa[j].id=j;
                sa[j].rk=1ll*rk[j]*__;
                if(j+i<=n)
                    sa[j].rk+=rk[j+i];
            }
        }
    }
    
    //he[i]: 第i名后缀与第i-1名后缀的LCP
    template<class T>
    void get_he(T s[],int n,int rk[],int he[])
    {
        for(int i=1,cp=0;i<=n;i++)
        {
            if(cp)--cp;
            int j=sa[rk[i]-1].id,maxx=max(i,j);
            while(maxx+cp<=n && s[i+cp]==s[j+cp])
                cp++;
            he[rk[i]]=cp;//h[i]=cp;
        }
    }
    

    相关文章

      网友评论

          本文标题:Suffix Array

          本文链接:https://www.haomeiwen.com/subject/izmgaxtx.html