后缀自动机 模板

来源:互联网 发布:微信公众号php开发 编辑:程序博客网 时间:2024/06/04 19:59
class match{public://用m来定义字符串中字符的个数的,0~m-1int 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的节点的值复制给nqint 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;

原创粉丝点击