在回答什么是suffix auto machine前我们需要先知道什么是auto machine。
什么是自动机?一个FSN(有限状态自动机)就是一个具有识别字符串S对于自动机A是true还是false;即当s属于alpha,判断trans(state,ch)是否等于end;
structSAM_Node
{
SAM_Node*fa,*next[CHAR];intlen;
intid,pos;
SAM_Node(){}
SAM_Node(int_len){
fa= 0;
len= _len;memset(next,0,sizeof(next));
}};
SAM_NodeSAM_node[MAXN*2], *SAM_root, *SAM_last;intSAM_size;
SAM_Node*newSAM_Node(intlen)
{
SAM_node[SAM_size] =SAM_Node(len);SAM_node[SAM_size].id= SAM_size;return&SAM_node[SAM_size++];
}
SAM_Node*newSAM_Node(SAM_Node*p){
SAM_node[SAM_size] = *p;SAM_node[SAM_size].id= SAM_size;return&SAM_node[SAM_size++];
}
voidSAM_init(){
SAM_size = 0;
SAM_root = SAM_last = newSAM_Node(0);SAM_node[0].pos= 0;
}
voidSAM_add(intx,intlen){
SAM_Node*p = SAM_last, *np = newSAM_Node(p->len+1);np->pos= len;
SAM_last = np;for(;p && !p->next[x];p = p->fa)p->next[x] = np;
if(!p){
np->fa= SAM_root;
return;}
SAM_Node*q = p->next[x];if(q->len== p->len+ 1){
np->fa= q;
return;}
SAM_Node*nq = newSAM_Node(q);nq->len= p->len+ 1;
q->fa= nq;
np->fa= nq;
for(;p && p->next[x] == q;p = p->fa)p->next[x] = nq;
}
voidSAM_build(char*s){
SAM_init();
intlen =strlen(s);for(inti = 0;i < len;i++)
SAM_add(s[i] -'a',i+1);
}
//加入串后进行拓扑排序。charstr[MAXN];
inttopocnt[MAXN];SAM_Node*topsam[MAXN*2];
intn =strlen(str);SAM_build(str);memset(topocnt,0,sizeof(topocnt));for(inti = 0;i < SAM_size;i++)
topocnt[SAM_node[i].len]++;for(inti = 1;i <= n;i++)
topocnt[i] += topocnt[i-1];for(inti = 0;i < SAM_size;i++)
topsam[--topocnt[SAM_node[i].len]] = &SAM_node[i];