首页 > 编程知识 正文

后缀树与后缀数组,java数组从小到大排序

时间:2023-05-04 18:56:00 阅读:173127 作者:3469

接送门

后缀数组可能会有点绕圈子,但核心是以基数为中心进行排序,分为第一关键词和第二关键词

继续倍增,组合第一关键词和第二关键词完成排序

不展开详细的过程。 解释起来很累。 (看了几个小时。 )

注释版

# include bits/stdc.husingnamespacestd; const int maxn=1e6 10; char s[maxn]; int x[maxn]、y[maxn]、c[maxn]、sa[maxn]、rk[maxn]、height[maxn]、n、m; void get_sa () { for } inti=1; i=n; I ) c(x ) I )=s ) I ); //最初的第一关键词是自己for(intI=2; i=m; I ) c(I )=c(I-1 ); //得到各关键字的最后的for (inti=n; i=1; I----sa[c[x[I]]----]=I; 排在c[x[i]]的是IFOR(intK=1; k=n; k=1(/k是第一、二个关键词的步骤({int num=0; for(intI=n-k1; i=n; I ) y[ num]=i; //y表示第二关键字在num中排名的数量的第一关键字的位置。 //[n-k 1,n]没有第二关键词,开头为for(intI=1; i=n; I ) if(sa[I]k ) y[ num]=sa[i]-k; //上次排名在I的数,如果下标大于k,则这次下标为i-k的第二关键字for(intI=1; i=m; I ) c[i]=0; for(intI=1; i=n; I ) c(x ) I ); //在上次循环中计算出的第一关键词中,直接输入for(intI=2; i=m; I ) c(I )=c(I-1 ); for(intI=n; i=1; I---sa [ c [ x [ y [ I ] ]-- ]=y [ I ],y[i]=0; //x[y[i]]指示第二关键字排名为I的第一关键字是什么,c[]--表示计算排名swap(x,y ); x[sa[1]]=1,num=1; 从//Y生成下一个xfor (inti=2; i=n; I ) x[sa[I] () y[sa[I] )=y[sa[I-1] ) y[sa[I]k]==y[sa[I-1]k]? num: num; //仅在第一关键字和第二关键字都相等情况下,下一个第一关键字排序与本次相等的if(num==n ) break; m=num; //有这么多类型) }for(intI=1; i=n; I ) printf('%d ',sa[i]; (}int main ) ) Scanf ) ' %s ',s 1 ); n=Strlen(s1; m=122; get_sa (; }无评论版

# include bits/stdc.husingnamespacestd; const int maxn=1e6 10; char s[maxn]; int x[maxn]、y[maxn]、c[maxn]、sa[maxn]、rk[maxn]、height[maxn]、n、m; void get_sa () { for } inti=1; i=n; I ) c(x ) I )=s ) I ); for(intI=2; i=m; I ) c(I )=c(I-1 ); for(intI=n; i=1; I----sa[c[x[I]]----]=I; for(intk=1; k=n; k=1) {int num=0; for(intI=n-k1; i=n; I ) y[ num]=i; for(intI=1; i=n; I ) if(sa[I]k ) y[ num]=sa[i]-k; for(intI=1; i=m; I ) c[i]=0; for(intI=1; i=n; I ) c(x ) I ); for(intI=2; i=m; I ) c(I )=c(I-1 ); for(intI=n; i=1; I---sa [ c [ x [ y [ I ] ]-- ]=y [ I ],y[i]=0; swap(x,y ); x[sa[1]]=1,num=1; for(intI=2; i=n; I ) x[sa[I] () y[sa[I] )=y[sa[I-1] ) y[sa[I]k]==y[sa[I-1]k]? num: num; if(num==n ) break; m=num; //有这么多类型) }for(intI=1; i=n; I ) printf('%d ',sa[i]; }void get_height () {int k=0; for(intI=1; i=n; I ) rk[sa[i]]=i; for(intI=1; i=n; I ) if(rk[I]==1) continue;//第一名height为0if(k ) k----; //h [ I ]=h [ I-1 ]-1 intj=sa [ rk [ I ]-1 ]; wile(jk=Nik=ns[Ik]==s[jk] ) k; height[rk[i]]=k; }for(intI=1; i=n; I ) printf('%d ',height[i]; (}int main ) ) Scanf ) ' %s ',s 1 ); n=Strlen(s1; m=122; get_sa (; }

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。