zoukankan      html  css  js  c++  java
  • 模板 -- 后缀数组

    #include<map>
    #include<cmath>
    #include<queue>
    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    #define ll long long
    #define N 200010
    int n,v[N],sa1[N],rk1[N],sa2[N],rk2[N],ht[N];
    char s[N];
    int *sa,*rk,*SA,*RK;
    int main()
    {
        scanf("%d",&n);
        scanf("%s",s+1);
        rk=rk1;RK=rk2;sa=sa1;SA=sa2;
        int i,k,j;
        for(i=1;i<=n;i++) v[s[i]]++;
        for(i=1;i<=200;i++) v[i]+=v[i-1];
        for(i=n;i;i--) sa[v[s[i]]--]=i;
        for(i=1;i<=n;i++) rk[sa[i]]=rk[sa[i-1]]+(s[sa[i]]!=s[sa[i-1]]);
        for(k=1;k<=n;k<<=1)
        {
            for(i=1;i<=n;i++) v[rk[sa[i]]]=i;
            for(i=n;i;i--) if(sa[i]>k) SA[v[rk[sa[i]-k]]--]=sa[i]-k;
            for(i=n-k+1;i<=n;i++) SA[v[rk[i]]--]=i;
            for(i=1;i<=n;i++) RK[SA[i]]=RK[SA[i-1]]+(rk[SA[i]]!=rk[SA[i-1]]||rk[SA[i]+k]!=rk[SA[i-1]+k]);
            swap(sa,SA);swap(rk,RK);
        }
        k=0;
        for(i=1;i<n;i++)
        {
            j=rk[i]-1;
            while(s[sa[rk[i]]+k]==s[sa[j]+k]) k++;
            ht[rk[i]]=k;
            if(k) k--;
        }
        for(i=1;i<=n;i++) printf("%d ",sa[i]-1);
        puts("");
        for(i=1;i<=n;i++) printf("%d ",rk[i]);
        puts("");
        for(i=2;i<=n;i++) printf("%d ",ht[i]);
        puts("");
        return 0;
    }

    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    初识echarts
    深浅拷贝的理解
    react基本语法及组件
    webpack使用
    网上面试资料整理
    封装原生promise函数
    vue路由懒加载及组件懒加载
    译文---C#堆VS栈(Part Four)
    译文---C#堆VS栈(Part Three)
    译文---C#堆VS栈(Part Two)
  • 原文地址:https://www.cnblogs.com/lkhll/p/6556066.html
Copyright © 2011-2022 走看看