后缀自动机

后缀自动机 SAM


不太懂,并不想说什么..
参考资料:
hihocoder后缀自动机基本概念
陈立杰的WC课件
fhq的博客
俄文论文翻译

附个\(insert\)图(来自:https://www.cnblogs.com/Yuzao/p/7267490.html
这里写图片描述

void insert(int c){
	int p=last,np=++cnt;
	last=np;
	len[np]=len[p]+1;
	for(;p&&!ch[p][c];p=fa[p]) ch[p][c]=np;
	if(!p) fa[np]=1;
	else{
		int q=ch[p][c];
		if(len[q]==len[p]+1) fa[np]=q;
		else{
			int nq=++cnt;
			len[nq]=len[p]+1;
			memcpy(ch[nq],ch[q],sizeof(ch[q]));
			fa[nq]=fa[q];
			fa[q]=fa[np]=nq;
			for(;ch[p][c]==q;p=fa[p]) ch[p][c]=nq;
		}
	}
	size[np]=1;
}

void get_size(){
	for(int i=1;i<=cnt;i++) c[len[i]]++;
	for(int i=1;i<=cnt;i++) c[i]+=c[i-1];
	for(int i=cnt;i;i--) a[c[len[i]]--]=i;
	for(int i=cnt;i;i--){
		int p=a[i];
		size[fa[p]]+=size[p];
	}
}
posted @ 2018-07-22 23:19  LSQ647  阅读(280)  评论(0编辑  收藏  举报