SAM

SAM可以解决几乎所有的字符串子串问题

SAM支持将一个字符串的所有子串与SAM中一条从起始点开始的路径一一对应(并在线性的时间与空间当中
它的核心思想是将整个字符串都从头建进去。

核心代码:

点击查看代码
void add(int c){
	int p=lst;//该点前的“主链”上的点
	int np=lst=++tot;//此时该建哪个点
	siz[tot]=1;
	dian[np].len=dian[p].len+1;
	for(;p&&!dian[p].sn[c];p=dian[p].fa) dian[p].sn[c]=np;
	if(!p) dian[np].fa=1;
	else {
		int q=dian[p].sn[c];
		if(dian[p].len+1==dian[q].len) dian[np].fa=q;
		else{
			int nq=++tot;
			dian[nq]=dian[q];
			dian[nq].len=dian[p].len+1;
			dian[q].fa=dian[np].fa=nq;
			for(;p&&dian[p].sn[c]==q;p=dian[p].fa) dian[p].sn[c]=nq;
	 	}
	}
}

首先,它的建立为一个一个字符加进自动机里。

具体操作:

1.当前要新加入的节点

posted @ 2022-05-31 18:31  蒟蒻jht  阅读(451)  评论(1)    收藏  举报