美文网首页
后缀数组

后缀数组

作者: Gitfan | 来源:发表于2017-03-10 10:08 被阅读0次

http://uoj.ac/problem/35

#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxn 100005
using namespace std;
char s[maxn];
int sa[maxn],t[maxn],t2[maxn],c[maxn],Rank[maxn],height[maxn],n;
void build_sa(int m){
    int i,*x=t,*y=t2,*T,p ;
    n++;
    for(i=0;i<m;++i)c[i]=0;
    for(i=0;i<n;++i)++c[x[i]=s[i]];
    for(i=1;i<m;++i)c[i]+=c[i-1];
    for(i=n-1;i>=0;--i)sa[--c[x[i]]]=i;
    for(int k=1;k<=n;k<<=1)
    {
       p=0;
       for(i=n-1;i>=n-k;--i)y[p++]=i;
       for(i=0;i<n;++i)if(sa[i]>=k)y[p++]=sa[i]-k;
       for(i=0;i<m;++i)c[i]=0;
       for(i=0;i<n;++i)++c[x[y[i]]];
       for(i=1;i<m;++i)c[i]+=c[i-1];
       for(i=n-1;i>=0;--i)sa[--c[x[y[i]]]]=y[i];
       swap(x,y);
       x[sa[0]]=0;p=1;
       for(i=1;i<n;++i)
         x[sa[i]]=y[sa[i-1]]==y[sa[i]]&&y[sa[i-1]+k]==y[sa[i]+k]?p-1:p++;
       if(p>=n)break;
       m=p;
    }
    n--;
    for(int i=1;i<=n;++i)printf("%d ",sa[i]+1);
    printf("\n");

}
void LCP(){
    int i,j,k=0;
    for(i=1;i<=n;i++)Rank[sa[i]]=i;
    for(int i=0;i<n;++i)
    {
       j=sa[Rank[i]-1];//h[i-1]
       if(k)k--;
       while(s[i+k]==s[j+k])k++;
       height[Rank[i]]=k;//h[i]
    }
    for(int i=2;i<=n;++i)printf("%d ",height[i]);
}
int main(){
    scanf("%s",s);
    n=strlen(s);
    build_sa(256);
    LCP();
    return 0;
}

相关文章

  • 后缀树(suffix tree & array)

    定义:后缀数组(suffix array)是将字符串的所有后缀进行排序放入数组中。后缀树(suffix tree)...

  • 后缀数组

    一、定义 对于长度为n的文本串T[1...n],T的后缀是指从第i个字符开始到T的末尾所形成的子串T[i...n]...

  • 后缀数组

    http://uoj.ac/problem/35

  • 后缀数组1模板(强推罗XX的论文,贼棒)

    先%罗DADA建议按照论文手推,更易明白再%kuangbin大神 1、什么是后缀数组 后缀数组是后缀树的替代品,十...

  • 后缀数组模板

    来自dzj

  • 指针数组与数组指针

    指针数组与数组指针 这两个名词乍一看很相似,很让人分不清什么意思?其实主要看后缀名就可以了。指针数组,后缀为数组,...

  • 字符串

    字符串DP 字符串匹配 后缀数组 后缀数组的注意点:1 两个串拼接在一起。2 height数组的性质。POJ 15...

  • 字符串算法小结

    hash kmp和ac自动机 后缀数组,后缀自动机,后缀树 扩展kmp manacher算法 回文自动机 可删改的...

  • 后缀数组之精髓——height数组

    上期我们介绍了后缀数组中代码最难写的一部分,今天我们来讲解一下后缀数组中最精髓的一部分——height数组的求解。...

  • 后缀数组_最长回文

    给定一个字符串,求最长回文子串。算法分析:穷举每一位,然后计算以这个字符为中心的最长回文子串。注意这里要分两种情况...

网友评论

      本文标题:后缀数组

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