#include<cstdio> #include<cstring> #include<iostream> using namespace std; const int N=1e5+5; char s[N]; int len,maxx,sa[N],rank[N],sum[N],tsa[N],trank[N],height[N]; void Radix_sort() { maxx=256; memset(sum,0,sizeof(sum)); for(int i=1;i<=len;i++) { rank[i]=s[i]; sum[rank[i]]++; } for(int i=2;i<=maxx;i++) sum[i]+=sum[i-1]; for(int i=len;i;i--) sa[sum[rank[i]]--]=i; } void DA() { int p; Radix_sort(); trank[sa[1]]=1,p=1; for(int i=2;i<=len;i++) { if(rank[sa[i]]!=rank[sa[i-1]]) p++; trank[sa[i]]=p; } for(int i=1;i<=len;i++) rank[i]=trank[i]; for(int j=1;p<len;j<<=1,maxx=p) { p=0; for(int i=len-j+1;i<=len;i++) tsa[++p]=i; for(int i=1;i<=len;i++) if(sa[i]>j) tsa[++p]=sa[i]-j; memset(sum,0,sizeof(sum)); for(int i=1;i<=len;i++) trank[i]=rank[tsa[i]]; for(int i=1;i<=len;i++) sum[trank[i]]++; for(int i=2;i<=maxx;i++) sum[i]+=sum[i-1]; for(int i=len;i;i--) sa[sum[trank[i]]--]=tsa[i]; trank[sa[1]]=1,p=1; for(int i=2;i<=len;i++) { if((rank[sa[i]]!=rank[sa[i-1]])||(rank[sa[i]+j]!=rank[sa[i-1]+j])) p++; trank[sa[i]]=p; } for(int i=1;i<=len;i++) rank[i]=trank[i]; } for(int i=1,k=0;i<=len;i++) { int j=sa[rank[i]-1]; while(s[i+k]==s[j+k]) k++; height[rank[i]]=k; if(k>0) k--; } } int main() { scanf("%s",s+1); len=strlen(s+1); DA(); for(int i=1;i<=len;i++) printf("%d ",sa[i]); printf("\n"); for(int i=2;i<=len;i++) printf("%d ",height[i]); }
后缀数组
原创
©著作权归作者所有:来自51CTO博客作者xZiLing的原创作品,请联系作者获取转载授权,否则将追究法律责任
作者:xxy
本文版权归作者所有,转载请用链接,请勿原文转载,Thanks♪(・ω・)ノ。

提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
Java 中数组的使用(一维数组和二维数组)
本文详细的介绍了,在Java 中数组的使用,并对其内存存在形式进行了详细的分析。
数组 一维数组 二维数组 java基础 -
后缀数组 nbut1171 后缀数组
传送门:点击打开链接题意:完美的后缀数组模板测试题思路:学习后缀数
#include i++ #define -
「笔记」后缀数组
$$\large\text{后 缀 “树" 组}$$
后缀数组 学习笔记 笔记 -
【后缀数组】目录
待解决:hdu4691hdu4552hdu3518hdu3948hdu4622hdu4436
字符串 匹配 后缀数组 ACM 题集目录 -
压缩后缀数组
DescriptionInputOutputSample Input322 2 14 15 18 23 7 8 28 10 30 31 13 14 15 16 17 18 7 ...
i++ 数据 #include ios 编程题目