//后缀数组模板

int wa[maxn],wb[maxn],wv[maxn],ws[maxn];//这些都是需要用到的中间变量

int cmp(int *r,int a,int b,int l)

{

return r[a]==r[b]&&r[a+l]==r[b+l];

}

void da(int *r,int *sa,int n,int m)

//这里的n应该是字符串长度 + 1,最后一位为追加的0,我的感觉这里主要是为了方便下面height的求解,如果sa[0]出现在字符中间,则需要进行一些判断,从而增加了代码复杂度

//r为所求数组,sa为后缀数组

{

int i,j,p,*x=wa,*y=wb,*t;

//x首先存储原数组,然后变为rank数组

//y对应排序好的第二关键字所在位置

for(i=0;i

for(i=0;i

for(i=1;i

for(i=n-1;i>=0;i--) sa[--ws[x[i]]]=i;

for(j=1,p=1;p

{

//这两步对y进行处理,记录第二关键字所在位置,从小到大

for(p=0,i=n-j;i

for(i=0;i=j) y[p++]=sa[i]-j;//因为这里对应的是sa[],而sa[]中元素为有序已经排序好的,所以直接赋值即可

for(i=0;i

for(i=0;i

for(i=0;i

for(i=1;i

for(i=n-1;i>=0;i--) sa[--ws[wv[i]]]=y[i];//这里需要使用y[i]来赋值,y[]对应从小到大排序好第二关键字所在位置

for(t=x,x=y,y=t,p=1,x[sa[0]]=0,i=1;i

//上面的交换算法作用是将x数组所有元素赋值给y,如果直接y = x,则会使x,y指向同一地址

x[sa[i]]=cmp(y,sa[i-1],sa[i],j)?p-1:p++;//将sa[]转变为rank,使用x[]来存储。p记录后缀字符串不同的个数,如果等于n则可以结束

}

return;

}

//求height[],后缀数组的使用

int rank[nMax], height[nMax];

int calHeight(int *r, int *sa, int n)//这里的n为实际字符串长度

{

int i, j, k;

for(i = 1; i < n; ++ i) rank[sa[i]] = i;//将sa[]转变为rank[]。这里从1开始即可,因为rank[sa[0]]始终为0

for(i = 0; i < n; height[rank[i ++]] = k;)//到不了n,也就是说取不到追加的0,这样就可以避免rank[]等于0的情况,从而方便下面rank[i] - 1的运算

//h[i] = height[rank[i]],h[i] >= h[i - 1] - 1。h[i]表示后缀数组suffix(i)与前面相邻后缀数组的最长公共字符串

for(k ? k -- : 0, j = sa[rank[i] - 1]; r[i + k] == r[j + k]; k ++);

}

分享到:

2012-08-11 16:29

浏览 713

评论

后缀数组 java实现_后缀数组模板 - java开发指南博客 【转载】 - ITeye博客相关推荐

  1. 视频教程-企业微信支付JAVA版_向员工收款-微信开发

    企业微信支付JAVA版_向员工收款 微信企业号星级会员.10多年软件从业经历,国家级软件项目负责人,主要从事软件研发.软件企业员工技能培训.已经取得计算机技术与软件资格考试(软考)--"信息 ...

  2. yii2数组转为对象_好程序员Java学习路线分享java为什么不支持泛型数组

    本篇文章好程序员为大家一下java为什么不支持泛型数组,希望对大家有所帮助. public class Pair { public void info( ) { System.out.println( ...

  3. java8 从数组获取流_从数组到流再到Java 8

    java8 从数组获取流 不久前,我们将一些Eclipse插件项目升级到Java8.此后再也没有回头. 除其他事项外,使用lambda和streams API ,过滤,映射和查找集合中的元素变得更加容 ...

  4. java数组查找文本_基于数组的二叉查找树 Binary Search Tree (Java实现)

    二叉查找树 二叉查找树是一种支持动态查询的数据结构,所谓动态查寻结构:即在当数据集合内容发生改变时,集合内数据的排列组合不用重新构建.这样的数据结构在查询时需要不断变动的场景中是非常高效的,二叉查找树 ...

  5. java中对象数组如何构造_对象数组如何构造

    定义一个对象数组时是如何调用构造函数和析构函数的 #include #include using namespace std; //对象数组的初始化请看该函数 class student { publ ...

  6. java错位_【LeetCode(Java) - 634】寻找数组的错位排列

    [LeetCode(Java) - 634]寻找数组的错位排列 [LeetCode(Java) - 634]寻找数组的错位排列 文章目录 1.题目描述 2.解题思路 3.解题代码 1.题目描述 2.解 ...

  7. php 检查数组为空_检查数组是否为空在PHP中

    php 检查数组为空 Given an array and we have to check if array is an empty or not using PHP. 给定一个数组,我们必须检查数 ...

  8. android给数组添加新元素_「数组赋值」什么是数组、如何创建数组、数组赋值、数组增加一个新元素 - seo实验室...

    数组赋值 一起组团(什么是数组) 我们知道变量用来存储数据,一个变量只能存储一个内容.假设你想存储10个人的姓名或者存储20个人的数学成绩,就需要10个或20个变量来存储,如果需要存储更多数据,那就会 ...

  9. python定义三维数组手机端_三维数组python

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 我有一个三维数组temprsubset我取了两个维度的平均值. 代码:f=mfd ...

最新文章

  1. 计算机组成原理二进制地址码,计算机组成原理
  2. php中添加访问器,php – 结合访问器和mutator逻辑,为模型添加自定义属性
  3. 089-袁佳鹏-实验报告1
  4. 【模型解读】“全连接”的卷积网络,有什么好?
  5. 前端学习(3248):react的生命周期getSnapBeforeUpdate举例
  6. 前端学习(544):node的全局模块
  7. linux c语言 文件拷贝,怎么在linux下用c编程实现文件的复制
  8. Vue.js如何在一个页面调用另一个同级页面的方法
  9. sqlite3在Python2.7下对于中文路径的支持
  10. 宅男福利!20行Python代码,一网打尽B站小姐姐的直播信号源!
  11. 好学易懂 从零开始的插头DP(一)
  12. 个人简历模板怎么写?个人求职简历包含几个部分?
  13. 001.UG_NX概述
  14. 鲲鹏920的服务器芯片,鲲鹏920芯片是什么芯片
  15. 步步为营 SharePoint 开发学习笔记系列 二、安装和配置
  16. swift 函数类型+高阶函数
  17. repository ‘Gradle Libs‘ was added by unknown code
  18. 呼叫中心电话系统怎么搭建?能用到哪些智能应用?
  19. AE开发 遇到未能加载文件或程序集的问题 FileNotFoundException
  20. JVM 直接内存的使用与回收

热门文章

  1. Retrofit+Rxjava+Mvp+Kotlin实战
  2. 虚拟机NAT模式和桥接模式分析
  3. 深入解读GoogLeNet网络结构(附代码实现)
  4. Redis数据结构Set实战之京豆抽奖
  5. java输入流输出流的互相转换(不需要经过临时文件啦超方便)
  6. 无接触体征监测的技术和应用
  7. 突熊猛进,唯有藏宝计划(TPC)是你唯一的熊市生存法宝
  8. WSL设置网桥上网,IP设为固定IP
  9. linux命令之whereis和which
  10. 基于Windows API的VC++串口通信详解