复习了一遍后缀数组:
关于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的下标