AC自动机模板

int fail[N];
int trie[N][26],tot;
int g[N];
void add(char *s,int x)
{
    int p=0;
    for(int i=1;s[i];i++)
    {
        int c=s[i]-'a';
        if(!trie[p][c]) trie[p][c]=++tot;
        p=trie[p][c];
    }
    g[p]+=x;
}
void build()
{
    queue<int>q;
    for(int i=0;i<26;i++)
        if(trie[0][i]) q.push(trie[0][i]);
    while(!q.empty())
    {
        int u=q.front();q.pop();
        for(int i=0;i<26;i++)
        {
            if(trie[u][i])
            {
                fail[trie[u][i]]=trie[fail[u]][i];
                q.push(trie[u][i]);
            }
            else trie[u][i]=trie[fail[u]][i];
        }
    }
}
posted @ 2020-09-22 20:09  Suiyue_Li  阅读(114)  评论(0编辑  收藏  举报