后缀数组中height数组的解释
创始人
2025-05-30 05:31:03
0次

前文:点我
当我在使用后缀数组中会用到一个数组为heightheightheight
height[i]height[i]height[i]的定义为:排在第iii为的后缀和排在第i−1i-1i−1位的最长公共前缀
并且其应该满足下面这个定理
height[rnk[i]]≥height[rnk[i−1]]−1height[rnk[i]]\geq height[rnk[i-1]]-1 height[rnk[i]]≥height[rnk[i−1]]−1
这个定理的一种证明方法可以参考oi.wikioi.wikioi.wiki:

在这里插入图片描述
但是可以有其他的普通解释:
我们认为字符串是从左开始的,所以i−1i-1i−1位应该在第iii位的左侧,因此i−1i-1i−1位的后缀可以表示成为aAaAaA,第iii位的后缀可以表示成AAA,如果说aAaAaA与排在他前面的后缀SSS的最长公共前缀可以达到kkk位,那么在AAA中是不是一定会有k−1k-1k−1位能与AAA匹配. 那么当这k−1k-1k−1位打头组成后缀时,一定紧邻AAA,如果他们之间不紧邻,则一定有比k−1k-1k−1更长的前缀紧邻AAA,所以至少是k−1k-1k−1.
我们再来看一个字符串

//源串:bdbd
//设i的后缀为dbd
//设i-1的后缀为bdbd
排序:
bd
bdbd//i-1
d
dbd//i

在这个例子里,A=dbdA=dbdA=dbd,并且至少有ddd与dbddbddbd紧邻
根据这个引理可以推导出下面的用法:

void cal_height()
{int k = 0;for (int i = 0; i < n; i++){rank1[sa[i]] = i;}for (int i = 0; i < n; i++){if (rank1[i] == 0)continue;int j = sa[rank1[i] - 1];if (k != 0){k--;}//height[i]>=height[i-1]-1while (i + k < n&&j + k < n&&dp[i + k] == dp[j + k])k++;height[i] = k;}
}

相关内容

热门资讯

总算了解开挂!众乐乐开挂AI攻... 总算了解开挂!众乐乐开挂AI攻略,众乐乐多功能都是存在有开挂攻略1、上手简单,内置详细流程视频教学,...
程序员教你辅助!英豪娱乐城辅助... 程序员教你辅助!英豪娱乐城辅助AI工具,英豪娱乐城多功能原来真的是有辅助工具暗藏猫腻,小编详细说明英...
盘点几款辅助!冰球突破辅助AI... 盘点几款辅助!冰球突破辅助AI插件,冰球突破多功能其实真的有辅助插件1、冰球突破脚本辅助下载、冰球突...
分享一款辅助器!建湖好运麻将辅... 分享一款辅助器!建湖好运麻将辅助器AI教程,建湖好运麻将多功能竟然真的是有辅助器教程1、在建湖好运麻...
每日必备透视挂!新老夫子透视挂... 每日必备透视挂!新老夫子透视挂AI技巧,新老夫子多功能原来真的有透视挂技巧1、新老夫子脚本辅助下载、...
分享认知作弊器!星际互联作弊器... 分享认知作弊器!星际互联作弊器AI方法,星际互联多功能都是存在有作弊器方法1、每一步都需要思考,不同...
玩家必备攻略作弊器!闲逸斗地主... 玩家必备攻略作弊器!闲逸斗地主作弊器AI方法,闲逸斗地主多功能果然是有作弊器方法1、闲逸斗地主透视辅...
分辨真假透视挂!宁波游戏大厅透... 分辨真假透视挂!宁波游戏大厅透视挂AI软件,宁波游戏大厅多功能一直是有透视挂软件1、让任何用户在无需...
每日必看教程透视挂!君悦来透视... 每日必看教程透视挂!君悦来透视挂AI工具,君悦来多功能本来是有透视挂工具1、上手简单,内置详细流程视...
发现一款外挂!半岛外挂AI工具... 发现一款外挂!半岛外挂AI工具,半岛多功能一贯真的有外挂工具1、起透看视 半岛辅助软件价格2、随意选...