zoukankan      html  css  js  c++  java
  • 搜索关键词-AC自动机--acwing

    讲真的,即使是再次看过去也是有点迷迷糊糊的感觉,理解但是敲不出来,还是得看板子

    #include <iostream>
    #include <cstring>
    #include <string>
    #include <cmath>
    #include <cstdio>
    #include <stdio.h>
    #include <cstdlib>
    #include <algorithm>
    #include <vector>
    #include <set>
    #include <map>
    #include <iomanip>
    #define rep(i,a,b) for(int i = a; i <= b ; i ++ )
    #define pre(i,a,b) for(int i = b ; i >= a ; i --)
    #define ll long long
    #define inf 0x3f3f3f3f
    #define ull unsigned long long
    #define ios ios::sync_with_stdio(false),cin.tie(0)
    using namespace std;
    typedef pair<int,int> PII ;
    const int N = 10010, S = 55, M = 1000010;
    
    int n;
    int tr[N * S][26], cnt[N * S], idx;
    char str[M];
    int q[N * S], ne[N * S];
    
    void insert()
    {
        int p = 0;
        for (int i = 0; str[i]; i ++ )
        {
            int t = str[i] - 'a';
            if (!tr[p][t]) tr[p][t] = ++ idx;
            p = tr[p][t];
        }
        cnt[p] ++ ;
    }
    
    void build()
    {
        int hh = 0, tt = -1;
        for (int i = 0; i < 26; i ++ )
            if (tr[0][i])
                q[ ++ tt] = tr[0][i];
    
        while (hh <= tt)
        {
            int t = q[hh ++ ];
            for (int i = 0; i < 26; i ++ )
            {
                int p = tr[t][i];
                if (!p) tr[t][i] = tr[ne[t]][i];
                else
                {
                    ne[p] = tr[ne[t]][i];
                    q[ ++ tt] = p;
                }
            }
        }
    }
    
    int main()
    {
        int T;
        scanf("%d", &T);
        while (T -- )
        {
            memset(tr, 0, sizeof tr);
            memset(cnt, 0, sizeof cnt);
            memset(ne, 0, sizeof ne);
            idx = 0;
    
            scanf("%d", &n);
            for (int i = 0; i < n; i ++ )
            {
                scanf("%s", str);
                insert();
            }
    
            build();
    
            scanf("%s", str);
    
            int res = 0;
            for (int i = 0, j = 0; str[i]; i ++ )
            {
                int t = str[i] - 'a';
                j = tr[j][t];
    
                int p = j;
                while (p)
                {
                    res += cnt[p];
                    cnt[p] = 0;
                    p = ne[p];
                }
            }
    
            printf("%d
    ", res);
        }
    
        return 0;
    }
    

      

  • 相关阅读:
    机器学习笔记
    python学习笔记-day8
    python学习笔记-day7
    python学习笔记-day6
    python学习笔记-day5
    python习题
    単語
    bat批处理----copy和xcopy区别
    C#
    VB
  • 原文地址:https://www.cnblogs.com/jxust-Biao/p/13340506.html
Copyright © 2011-2022 走看看