后缀数组

后缀数组

  1. 后缀,就是从字符串中的一个字符开始直到结束的字串;而后缀数组则能求出字符串中所有后缀的排名。

  2. 介绍即将登场的数组们:sa[i]记录的是排名为i的后缀是从第几个字符开始的;Rank[i]记录的是从第i个字符开始的后缀排名第几;c[]用于基数排序;

3.代码

#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;
const int N=1000005;
int n,na,Rank[N],sa[N],tmp[N],c[N];
char s[N];

 void make_sa()
{
	int j,len;
	na=max(n,256);
	memset(c,0,sizeof(c));
	for (int i=0; i=n-1) break;//优化,排名无重复则已完成排序
	}
}

 int main()
{
	scanf("%s",s); s[strlen(s)]='$';
	n=strlen(s);
	make_sa();
	for (int i=1; i

LCP

后缀的排名已经完成,那么有什么用呢?LCP(最长公共前缀)就出现了。

1.H[i]数组表示排名为i的后缀与其他后缀的最长公共前缀的长度。

2.想到既然所有后缀都已排名,那么相邻的后缀相似度最高,可以得到第i个后缀与其他后缀的最长公共前缀即为其与第i-1个的最长公共前缀。

void lcp()
{
	int j,k=0;
	for (int i=0; i

你可能感兴趣的:(后缀数组)