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.当前要新加入的节点