后缀数组模版(自写)

struct SuffixArray{
    static constexpr int N = 1e6 + 5 ;
    int M = 100;
    int sa[N],rank[N],tp[N],a[N];
    int n ;
    void Sort(){
        for(int i = 0; i < M ; i ++){
            a[i] = 0;
        }
        for(int i = 0 ; i < n ; i++){
            a[rank[i]]++;
        }
        for(int i = 1 ;i < M; i++){
            a[i] += a[i - 1];
        }
        for(int i = n - 1; i >= 0 ; i--){
            sa[--a[rank[tp[i]]]] = tp[i];
        }
    }
    void build(string s){
        n = s.length();
        for(int i = 0; i < n ;i ++){
            rank[i] = s[i] - '0';
            tp[i] = i;
        }
        Sort();
        for(int len = 1 , p = 0; p < n - 1; M = p + 1, len <<= 1){
            
            p = 0;
            for(int i = 0; i < len ; i ++){
                tp[p++] = n - i - 1;
            }
            for(int i = 0 ; i < n ;i++){
                if(sa[i] >= len){
                    tp[p++] = sa[i] - len;
                }
            }
         
            Sort();
            swap(tp , rank);
            for(int i = 0; i < n; i++){
                if(i == 0){
                    rank[sa[i]] = p = 0;
                    continue;
                }
                rank[sa[i]] = p;
                if(tp[sa[i]] != tp[sa[i - 1]])rank[sa[i]] = ++ p;
                else {
                    if(sa[i - 1] + len < n && sa[i] + len < n){
                        if(tp[sa[i - 1] + len] != tp[sa[i] + len])rank[sa[i]] = ++p;
                    }
                    else rank[sa[i]] = ++p;

                }
            }

        }

        

    }
}sa;

你可能感兴趣的:(学习,算法,c++,数据结构)