首先学习基数排序。

memset(b, 0, sizeof(b));
for(int i = 0; i < n; i++) b[a[i]]++;
for(int i = 1; i <= m; i++) b[i] += b[i-1];
for(int i = n-1; ~i; i++) g[--b[a[i]]] = i;

这是对字符集大小为m的数组排序,g是对a的排行榜数组,且对于相同的数左边<右边。

则SA中的

for(int i = 0; i < m; i++) b[i] = 0; // m是字符集大小
for(int i = 0; i < n; i++) b[x[i]=s[i]]++;
for(int i = 1; i < m; i++) b[i] += b[i-1];
for(int i = n-1; !~i; i--) sa[--b[x[i]]] = i;

就是对x[i]=s[i]求排行榜数组。

for(int k = 1; k <= n; k <<= 1)

显然这一句是枚举长度k。

int p = 0;
for(int i = n-k; i < n; i++) y[p++] = i;
for(int i = 0; i < n; i++) if(sa[i] >= k) y[p++] = sa[i] - k;

这一块是对y数组操作,先将n-k到n-1放进去,再将[0,n)中sa[i]-k>=0的sa[i]-k放进去。

for(int i = 0; i < m; i++) b[i] = 0;
for(int i = 0; i < n; i++) b[x[y[i]]]++;
for(int i = 1; i < m; i++) b[i] += b[i-1];
for(int i = n-1; !~i; i--) sa[--b[x[y[i]]]] = y[i];

这是对x[y[i]]求排行榜数组。

swap(x, y);
p = 1; x[sa[0]] = 0;
for(int 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;

这是处理新的x数组。y是充当原来的x。其他细节与代码相同。

便于记忆的SA构造的更多相关文章

  1. 犯罪构成三层次记忆口诀 zt

    犯罪构成三层次记忆口诀 2012-02-17 来源:为你辩护网 浏览次数:232 0 众所周知,犯罪构成“四要件”和犯罪构成“三层次”(“三阶层”)都是分析具体刑事案件的辅助性工具.犯罪构成四要件是指 ...

  2. IT运维面试问题总结

    IT运维面试总结如下,后期更新于:https://www.yuque.com/docs/share/d3dd1e8e-6828-4da7-9e30-6a4f45c6fa8e. 欢迎基于学习.交流目的的 ...

  3. 探索性思维——How to Solve It

    我觉得这篇文章和什么都能扯上点关系,比如编程. 很多人已经讨论过数学与编程的关系了,这里不想过多探讨,只是简单提一下:有些人把数学贬低地一文不值,认为做一般的应用软件用不到数学:而有些人则把数学拔高到 ...

  4. 路由 - ASP.NET MVC 4 系列

           软件开发人员常常对一些细小的细节问题倍加关注,由其在考虑源代码的质量和结构时更是如此.因此,当遇到大部分使用 ASP.NET 技术构建的站点,使用如下的 URL 地址时,可能会有些奇怪: ...

  5. 高质量C++/C编程指南(林锐)

    推荐-高质量C++/C编程指南(林锐) 版本/状态 作者 参与者 起止日期 备注 V 0.9 草稿文件 林锐   2001-7-1至 2001-7-18 林锐起草 V 1.0 正式文件 林锐   20 ...

  6. C、C++、Java、go的语法区别

    详细C++.Java比较:http://www.cnblogs.com/stephen-liu74/archive/2011/07/27/2118660.html 一.C.C++的区别 在很大程度上, ...

  7. 高质量C++[转]

    高质量C++/C编程指南 文件状态 [  ] 草稿文件 [√] 正式文件 [  ] 更改正式文件 文件标识: 当前版本: 1.0 作    者: 林锐 博士 完成日期: 2001年7月24日 版 本  ...

  8. Java程序设计 实验三

    北京电子科技学院(BESTI) 实     验    报     告 课程:Java程序设计   班级:1353       姓名:李海空  学号:20135329 成绩:             指 ...

  9. C语言通用双向循环链表操作函数集

    说明 相比Linux内核链表宿主结构可有多个链表结构的优点,本函数集侧重封装性和易用性,而灵活性和效率有所降低.     可基于该函数集方便地构造栈或队列集.     本函数集暂未考虑并发保护. 一  ...

随机推荐

  1. Oracle笔记----oracle数字类型number自增

    创建序列 create sequence seq_student start increment maxvalue nominvalue nocycle nocache; 创建触发器 create o ...

  2. 前后端分离djangorestframework——版本控制组件

    什么是版本控制 在实际开发中,随着时间的更新迭代,我们维护的项目可能会有很多个版本,所以我们写的API也有很多个版本,但是迭代到高版本,不可能以前的版本就不用了,比如一个手机端的app,不定期发布新版 ...

  3. unix2dos和dos2unix处理换行问题

    今天同事QQ给发来一个文件内容如下: 希望把文件内容转换为update table_name set col_name=第一列 where col_name=第二列;这种SQL格式,使用UE列模式秒秒 ...

  4. 9. svg学习笔记-裁剪和蒙版

    裁剪 在svg中进行剪切,对整个svg元素而言,可以使用<svg>元素的viewbox属性,对于单个元素则可以使用<clipPath>元素.在单个图形元素上使用裁剪,可以在&l ...

  5. shell 关于路径查询显示pwd

    获取根目录:dirname $0 cd到根目录:cd `dirname $0` 获取当前目录:pwd 因此,要获取当前目录应该是: cd `dirname $` && pwd 或者 $ ...

  6. js中实现隐藏部分姓名或者电话号码

    项目需要, 只显示用户的姓名和手机号开头跟结尾, 其他部分用 * 代替, 借鉴了网上的代码, 参考地址没来得及记下 hidden:function(str,frontLen,endLen) { var ...

  7. if else; while; break;continue ----流程控制系列

    第一种语法: if 条件: # @引号是为了把条件和结果分开. 结果1 # 一个Tab或者4个空格 @告诉程序满足上面的if条件才会执行结果1结果2 #如果条件为真(True),执行结果1,然后执行结 ...

  8. Kafka 0.11新功能介绍:空消费组延迟rebalance

    Kafka 0.11新功能介绍:空消费组延迟rebalance 在0.11之前的版本中,多个consumer实例加入到一个空消费组将导致多次的rebalance,这是由于每个consumer inst ...

  9. shopkeep/spark Dockerfile示例

    FROM java:openjdk- ENV HADOOP_HOME /opt/spark/hadoop- ENV MESOS_NATIVE_LIBRARY /opt/libmesos-.so ENV ...

  10. Ubuntu16.04 下 hadoop的安装与配置(伪分布式环境)

    一.准备 1.1创建hadoop用户 $ sudo useradd -m hadoop -s /bin/bash #创建hadoop用户,并使用/bin/bash作为shell $ sudo pass ...