后缀自动机SAM

变量

  • int tot\texttt{int tot}:节点个数。
  • int lst\texttt{int lst}:原串最后一个字符所在的节点。
  • Node a[p]\texttt{Node a[p]}:节点 pp 的信息。
  • int a[p].len\texttt{int a[p].len}:节点 pp 代表的子串集合中最长的长度。
  • int a[p].fa\texttt{int a[p].fa}:节点 ppparent\text{parent} 树上的父亲。
  • int a[p].ch[c]\texttt{int a[p].ch[c]}:节点 pp 在后缀自动机上接上字符 cc 后的节点。

函数

  • SAM()\texttt{SAM()}:初始化。
  • void insert(int c)\texttt{void insert(int c)}:插入字符 cc,注意是减掉 standardstandard 后的。

代码

struct SAM{
	int tot,lst;
	struct Node{
		int len,fa,ch[26];
		Node(){memset(ch,0,sizeof(ch));len=fa=0;}
	}a[N<<1];
	SAM(){tot=lst=1;}
	void insert(int c){
		int p=lst,np=lst=++tot,q,nq;
		a[np].len=a[p].len+1;
		for(;p&&!a[p].ch[c];p=a[p].fa)a[p].ch[c]=np;
		if(!p)a[np].fa=1;
		else{
			q=a[p].ch[c];
			if(a[q].len==a[p].len+1)a[np].fa=q;
			else{
				nq=++tot;a[nq]=a[q];
				a[nq].len=a[p].len+1;a[q].fa=a[np].fa=nq;
				for(;p&&a[p].ch[c]==q;p=a[p].fa)a[p].ch[c]=nq;
			}
		}
	}
}sam;
posted @ 2024-02-08 22:03  luckydrawbox  阅读(10)  评论(0)    收藏  举报  来源