1. 程式人生 > >ac自動機背誦用模板

ac自動機背誦用模板

    void insert(){
        scanf("%s",ch+1);
        int l=strlen(ch+1),now=1;
        for(int i=1;i<=l;i++)
        {
            int t=ch[i]-'A'+1;
            if(!to[now][t])to[now][t]=++cnt;
            now=to[now][t];
        }
        danger[now]=1;
    }
    void build_fail(){
        int head=1,tail=1;
        q[1]=1;
        while(head!=tail)
        {
            int now=q[head];head++;
            for(int i=1;i<=26;i++)
                if(int t=to[now][i])
                {
                int k=fail[now];
                while(!to[k][i])k=fail[k];
                fail[t]=to[k][i];
                q[++tail]=t;
                }
        }
    }