zoukankan      html  css  js  c++  java
  • 后缀排序板子

    中暑排序

    我就放个板子然后随便提点啥了

    大体思路:倍增+计数排序

    然后注意一个非常强的剪枝,当排名的数量等于(n)时,直接拿掉,而不是非要跑(log n)次排序。这个剪枝在字符集比较小的时候几乎没用,但字符集小跑的本身就比较快,在字符集大的时候非常强,基本只会排序3~4次。

    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    const int N=1e6+10;
    int Rank[N],sa[N],tax[N],sec[N],n,m,t1,t2;
    char s[N];
    void Rsort()
    {
        for(int i=1;i<=m;i++) tax[i]=0;
        for(int i=1;i<=n;i++) ++tax[Rank[i]];
        for(int i=2;i<=m;i++) tax[i]+=tax[i-1];
        for(int i=n;i;i--) sa[tax[Rank[sec[i]]]--]=sec[i];
    }
    bool cmp(int x,int y,int len){return sec[x]==sec[y]&&sec[x+len]==sec[y+len];}
    void SuffixSort()
    {
        scanf("%s",s+1);n=strlen(s+1);
        for(int i=1;i<=n;i++) Rank[i]=s[i],sec[i]=i;
        m=128;Rsort();
        for(int w=1,p=1,i;p<n;w<<=1,m=p)
        {
            for(p=0,i=n-w+1;i<=n;i++) sec[++p]=i;
            for(i=1;i<=n;i++) if(sa[i]>w) sec[++p]=sa[i]-w;
            Rsort(),std::swap(Rank,sec);
            Rank[sa[1]]=p=1;
            for(i=2;i<=n;i++)
                Rank[sa[i]]=cmp(sa[i],sa[i-1],w)?p:++p;
        }
    }
    int main()
    {
        SuffixSort();
        for(int i=1;i<=n;i++) printf("%d ",sa[i]);
        return 0;
    }
    

    2018.12.15

  • 相关阅读:
    Leetcode 532.数组中的K-diff数对
    Leetcode 529.扫雷游戏
    定增游戏(三)
    套利不归路(五)
    定增游戏(一)
    套利不归路(四)
    套利不归路(三)
    套利不归路(二)
    套利不归路(一)
    减持大逃亡(二)
  • 原文地址:https://www.cnblogs.com/butterflydew/p/10122852.html
Copyright © 2011-2022 走看看