后缀数组模板+LCP小证明

这篇博客回顾了后缀数组的概念,并深入探讨了LCP(最长公共前后缀)的证明,阐述了为何LCP(i, j)等于区间height最小值的原理。通过分析字符串字典序的变化,说明了LCP的性质和计算方法,同时扩展讨论了连续后缀的LCP计算。" 5090867,354882,解决Hibernate报错:unknown Oracle major version [11],"['Oracle数据库', '数据库迁移', 'Hibernate配置', 'JTA数据源', 'Java持久化']
摘要由CSDN通过智能技术生成

复习了一遍后缀数组:

关于LCP的证明:简单的说下:

设p=min(height[k])       i<k<=j

LCP(i,j)=p,

显然LCP(i,j)<=p(排名越相近,前缀越可能相同)

假设LCP(i,j)= tp。

则字符串sa[i]和字符串sa[j]前tp位相同。

从sa[i]到sa[j]之间的字符串一定是从sa[i]到sa[j] 字典序递增变化。

则其会一点点从len[sa[i]]变化到tp+1位,知道变成sa[j],每一位变化跟前一位的LCP一定小于等于当前。

即p<=tp

又因为tp<=p;

则tp==p即

等式LCP(i,j)=min(height[k])       i<k<=j

成立!

 

另外:(小拓展)

LCP(i,j)其实就是LCP(i,i+1,i+2……,j)即连续L个后缀的LCP

#include<cstdio>
#include<cstring>
#include<algorithm>
const int MAXN = 1e6 + 10;
using namespace std;
char s[MAXN];
int N, M, rak[MAXN], sa[MAXN], tax[MAXN], tp[MAXN],Height[MAXN];
//tp[i]   第二关键字排名i的下标
//rak[i]  下标i的后缀的排名
//sa[i]    第一关键字排名i的下标
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值