class match
{
public://用m来定义字符串中字符的个数的,0~m-1
int son[N][M];//一般的是26个英文字母的,N为节点的个数
int fa[N],step[N];//fa指的是前面的那个的
int len,last;
//len指的是总的节点的个数,last指的是横线上给的最多n个的
int node(int x)
{
step[++len]=x;
rep(i,M) son[len][i]=0;//附初值为1 的
fa[len]=0;
return len;//标记所建的点的值的
}
void add(int k)
{
int p=last;//指的是最新添加的一个节点的位置的
int np=node(step[p]+1);
while(p && !son[p][k]) son[p][k]=np,p=fa[p];
if(!p) fa[np]=1;
else
{
int q=son[p][k];
if(step[p]+1==step[q]) fa[np]=q;//记录所走的步数的
else
{//新建立一个节点来代替q节点的,所以讲q的节点的值复制给nq
int nq=node(step[p]+1);
rep(i,M) son[nq][i]=son[q][i];
fa[nq]=fa[q];
fa[q]=fa[np]=nq;
while(p && son[p][k]==q) son[p][k]=nq,p=fa[p];
}
}
last=np;
}
void init()//roor代表的值为1的
{
len=0;
last=node(len);
}
};
match sa;
后缀自动机 模板
最新推荐文章于 2018-12-17 16:29:00 发布