后綴數組學習筆記


寫在前面

學了5,6遍,學一次忘一次 所以還是整理一下吧

定義

一個rk數組 一個sa數組

rk[i]表示第i個后綴的排名

sa[i]表示排名為i的后綴的初始位置的下標

Code

#include<bits/stdc++.h>
using namespace std;
#define rint register int
const int maxn = 1e6 + 10;
int rk[maxn],tp[maxn],sa[maxn],cnt[maxn],n,m;
char s[maxn];

void Rsort() {
	memset(cnt+1,0,m*4);
	for(rint i = 1;i <= n;++i) cnt[rk[i]]++;
	for(rint i = 2;i <= m;++i) cnt[i] += cnt[i-1];
	for(rint i = n;i >= 1;--i) sa[cnt[rk[tp[i]]]--] = tp[i];
}

int main(){
	scanf("%s",s+1);
	n = strlen(s+1), m = 75;
	for(rint i = 1;i <= n;++i) rk[i] = s[i] - '0' + 1, tp[i] = i;
	Rsort();
	for(rint w = 1, p = 0;p < n;m = p, w *= 2) {
		p = 0;
		for(rint i = n-w+1;i <= n;++i) tp[++p] = i;
		for(rint i = 1;i <= n;++i) if(sa[i] > w) tp[++p] = sa[i] - w;
		Rsort(); memcpy(tp+1,rk+1,n*4); p = rk[sa[1]] = 1;
		for(rint i = 2;i <= n;++i) rk[sa[i]] = (tp[sa[i]]==tp[sa[i-1]] && tp[sa[i]+w]==tp[sa[i-1]+w]) ? p : ++p;
	}
	for(rint i = 1;i <= n;++i) printf("%d ",sa[i]);
	return 0;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM