• luogu_3966【题解】单词 AC自动机


    题面:https://www.luogu.org/problemnew/show/P3966

    大意:小张最近在忙毕设,所以一直在读论文。一篇论文是由许多单词组成但小张发现一个单词会在论文中出现很多次,他想知道每个单词分别在论文中出现了多少次。

    这次没有文本串。

    用了个奇妙的方法。

    a[x] 表示第x个串结尾的位置。

    在bfs搜索求fail的时候手写,将所有的点都保存下来了。

    num(x)则为经过这个点x的个数。

    自然num(fail(x))+=num(x)。

    所有经过x的串都能经过fail(x)。

    最后求所有a[x]的num就是答案了。

    代码如下。

    #include<bits/stdc++.h>
    #define sc(x) scanf("%d",&x)
    using namespace std;
    const int maxn=1e6+10;
    int n,cnt;
    struct trie{
        int fail,num;
        int ch[30];
        #define fa(x) ac[x].fail
        #define nu(x) ac[x].num
    }ac[maxn];
    int a[maxn],h[maxn];
    inline void insert(string s,int x){
        int len=s.length();
        int now=0;
        for(int i=0;i<len;i++){
            if(!ac[now].ch[s[i]-'a'])
                ac[now].ch[s[i]-'a']=++cnt;
            now=ac[now].ch[s[i]-'a'];
            nu(now)++;
        }
        a[x]=now;
    }
    //bfs
    inline void getfail(){
        int head=0;int tail=0;
        for(int i=0;i<26;i++)
            if(ac[0].ch[i])
                fa(ac[0].ch[i])=0,h[++tail]=ac[0].ch[i];
        while(head<tail){
            int now=h[++head];
            for(int i=0;i<26;i++){
                if(ac[now].ch[i]){
                    fa(ac[now].ch[i])=ac[fa(now)].ch[i];
                    h[++tail]=ac[now].ch[i];
                }
                else
                    ac[now].ch[i]=ac[fa(now)].ch[i];
            }
        }
    } 
    inline void ask(){
        for(int i=cnt;i>=0;i--) nu(fa(h[i]))+=nu(h[i]);
        for(int i=1;i<=n;i++) printf("%d
    ",nu(a[i]));
    }
    int main()
    {
        sc(n);
        string s;
        for(int i=1;i<=n;i++){
            cin>>s;
            insert(s,i);
        }
        fa(0)=0;
        getfail();
        ask();
        // while(1);
        return 0;
    }

    话说和网上大佬学的struct 存trie感觉挺有意思。

    改不过来了。

  • 相关阅读:
    Tensorflow实现LSTM识别MINIST
    linux误删除恢复
    python使用工具简介介绍
    一个画ROC曲线的封装包
    Anaconda基本使用
    对于进程没杀死占用内存和cpu行为的方法
    Gluon
    原博客地址
    训练词向量
    TPU尝试
  • 原文地址:https://www.cnblogs.com/ChrisKKK/p/11144072.html
Copyright © 2020-2023  润新知