博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
2倍倍增算法构造后缀数组
阅读量:5281 次
发布时间:2019-06-14

本文共 1573 字,大约阅读时间需要 5 分钟。

        2倍倍增算法的主要思路是:用倍增的方法对每个字符开始的长度为2^k的字符串进行排序,求出排名,即rank值。

#include
using namespace std;const int maxlen = 10011;int tsa[maxlen], RANK[maxlen], sum[maxlen], sa[maxlen], TRANK[maxlen];void radix_sort(int j, int len){ //对第二关键字计数排序,tsa代替sa为排名为i的后缀是tsa[i] memset(sum,0,sizeof(sum)); for (int i=1; i<=len; i++){ if(i+j>len) RANK[i+j]=0; sum[ RANK[i+j] ]++; } for (int i=1; i<=maxlen; i++) sum[i]+=sum[i-1]; for (int i=len; i>0; i--) tsa[ sum[ RANK[i+j] ]-- ]=i; //对第一关键字计数排序,构造互逆关系 memset(sum,0,sizeof(sum)); for (int i=1; i<=len; i++) sum[ RANK[i] ]++; for (int i=1; i<=maxlen; i++) sum[i]+=sum[i-1]; for (int i=len; i>0; i--) sa[ sum[ RANK[ tsa[i] ] ]-- ]= tsa[i]; } void calc_sa(int *s, int len){ int p; // TRANK存放字符串 // int len=s.size(); for (int i=0; i
0; i--) sa[ sum[ TRANK[i] ]-- ]=i; // 计算RANK RANK[ sa[1] ]=1; for (int i=2,p=1; i<=len; i++){ if (TRANK[ sa[i] ]!=TRANK[ sa[i-1] ]) p++; RANK[ sa[i] ]=p; }//第一次的sa与RANK构造完成 for (int j=1; j<=len; j*=2){ // 对长度为j的字符串进行排名 radix_sort(j,len); TRANK[ sa[1] ]=1; p=1; //用TRANK代替RANK // 计算RANK for (int i=2; i<=len; i++){ if(sa[i]+j > len) RANK[ sa[i]+j ]=0; if(sa[i-1]+j > len) RANK[ sa[i-1]+j ]=0; if ((RANK[ sa[i] ]!=RANK[ sa[i-1] ]) || (RANK[ sa[i]+j ]!=RANK[ sa[i-1]+j ])) p++; TRANK[ sa[i] ]=p;//空间要开大一点,至少2倍 } for (int i=1; i<=len; i++) RANK[i]=TRANK[i]; }}void calc_height(int *s, int len){ int k=0,j; for(int i=0; i

参考:后缀数组 ()

      罗穗骞 《后缀数组——处理字符串的有力工具》

转载于:https://www.cnblogs.com/Rex7/p/4752565.html

你可能感兴趣的文章
C# Stream 和 byte[] 之间的转换
查看>>
OMG: daily scrum nine
查看>>
redis与spring结合错误情况
查看>>
第六章 字节码执行方式--解释执行和JIT
查看>>
字符串方法title()、istitle()
查看>>
yield语句
查看>>
查看linux系统中占用cpu最高的语句
查看>>
[洛谷P1738]洛谷的文件夹
查看>>
ubuntu server设置时区和更新时间
查看>>
【京东咚咚架构演进】-- 好文收藏
查看>>
【HTML】网页中如何让DIV在网页滚动到特定位置时出现
查看>>
文件序列化
查看>>
jQuery之end()和pushStack()
查看>>
Bootstrap--响应式导航条布局
查看>>
Learning Python 009 dict(字典)和 set
查看>>
JavaScript中随着鼠标拖拽而移动的块
查看>>
HDU 1021 一道水题
查看>>
The operation couldn’t be completed. (LaunchServicesError error 0.)
查看>>
php每天一题:strlen()与mb_strlen()的作用分别是什么
查看>>
工作中收集JSCRIPT代码之(下拉框篇)
查看>>