• AC自动机模板1


    题目链接:https://www.luogu.org/problemnew/show/P3808

    要注意的是一定要把len赋值strlen(s);不然超时超的自闭!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

    #include <bits/stdc++.h>
    using namespace std;
    #define ll long long
    #define re register
    #define fi first
    #define se second
    #define mp make_pair
    #define pb push_back
    #define P pair<int,int>
    const int N=1e6+10;
    void read(int &a)
    {
        a=0;
        int d=1;
        char ch;
        while(ch=getchar(),ch>'9'||ch<'0')
            if(ch=='-')
                d=-1;
        a=ch-'0';
        while(ch=getchar(),ch>='0'&&ch<='9')
            a=a*10+ch-'0';
        a*=d;
    }
    void write(int x)
    {
        if(x<0)
            putchar(45),x=-x;
        if(x>9)
            write(x/10);
        putchar(x%10+'0');
    }
    struct note
    {
        int to[30],bz,nex;
    }trie[N];
    int tot;
    char s[N];
    void ins(char *s)
    {
        int t=0;
        int len=strlen(s);
        for(re int i=0;i<len;i++)
        {
            int x=s[i]-96;
            if(!trie[t].to[x])
                trie[t].to[x]=++tot;
            t=trie[t].to[x];
        }
        trie[t].bz++;
    }
    void built()
    {
        queue <int> q;
        for(re int i=1;i<=26;i++)
            if(trie[0].to[i])
                trie[trie[0].to[i]].nex=0,q.push(trie[0].to[i]);
        while(!q.empty())
        {
            int p=q.front();
            q.pop();
            for(re int i=1;i<=26;i++)
                if(trie[p].to[i])
                    trie[trie[p].to[i]].nex=trie[trie[p].nex].to[i],q.push(trie[p].to[i]);
                else
                    trie[p].to[i]=trie[trie[p].nex].to[i];
        }
    }
    int solve(char *s)
    {
        int ans=0,now=0;
        int len=strlen(s);
        for(re int i=0;i<len;i++)
        {
            now=trie[now].to[s[i]-'a'+1];
            for(re int j=now;j&&trie[j].bz!=-1;j=trie[j].nex)
                ans+=trie[j].bz,trie[j].bz=-1;
        }
        return ans;
    }
    int main()
    {
        int n;
        read(n);
        while(n--)
        {
            scanf("%s",s);
            ins(s);
        }
        trie[0].nex=0;
        built();
        scanf("%s",s);
        cout<<solve(s)<<endl;
        return 0;
    }
    View Code
  • 相关阅读:
    hihocoder #1467 : 2-SAT·hihoCoder音乐节 2-SAT
    hihoCoder#1185 : 连通性·三 tarjan求强联通分量 缩点 dfs/拓扑排序求路径和最大值
    hihoCoder1175 拓扑排序·二 拓扑排序
    012 列表的一些常用操作符
    011,列表2
    010 列表1
    009,分支和循环3
    008,分支和循环2
    006 Python的操作符
    005 Python的数值类型
  • 原文地址:https://www.cnblogs.com/acm1ruoji/p/10662272.html
Copyright © 2020-2023  润新知