zoukankan      html  css  js  c++  java
  • ac自动机练习 HihoCoder 1036

    题目链接


    ac自动机模板题

    #include <stdio.h>
    #include <string.h>
    #include <iostream>
    #include <stdlib.h>
    #include <queue>
    using namespace std;
    const int N = 1e6 + 5;
    struct Trie
    {
        int next[N][26], ed[N], fail[N], root, pos;
        int newnode()
        {
            for(int i = 0; i < 26; i++)
                next[pos][i] = -1;
            ed[pos] = 0;
            return pos++;
        }
        void init()
        {
            pos = 0;
            root = newnode();
        }
        void insert(string s)
        {
            int n = s.size();
            int now = root;
            for(int i = 0; i < n; i++)
            {
                int b = s[i] - 'a';
                if(next[now][b] == -1) next[now][b] = newnode();
                now = next[now][b];
            }
            ed[now]++;
        }
        void build()
        {
            int now = root;
            queue<int> Q;
            fail[root] = root;
            for(int i = 0; i < 26; i++)
            {
                if(next[now][i] == -1)
                    next[now][i] = root;
                else
                {
                    fail[next[now][i]] = root;
                    Q.push(next[now][i]);
                }
            }
            while(!Q.empty())
            {
                int now = Q.front(); Q.pop();
                for(int i = 0; i < 26; i++)
                {
                    if(next[now][i] == -1)
                        next[now][i] = next[fail[now]][i];
                    else
                    {
                        fail[next[now][i]] = next[fail[now]][i];
                        Q.push(next[now][i]);
                    }
                }
            }
        }
        int query(string s)
        {
            int n = s.size();
            int now = root;
            int ans = 0;
            for(int i = 0; i < n; i++)
            {
                int b = s[i]-'a';
                now = next[now][b];
                int tmp = now;
                while(tmp != root)
                {
                    if(ed[tmp] >= 0)
                    {
                        ans += ed[tmp];
                        ed[tmp] = -1;
                    }
                    else
                        break;
                    tmp = fail[tmp];
                }
            }
            return ans;
        }
    };
    
    Trie ac;
    int n;
    string tmp;
    int main()
    {
        ac.init();
        scanf("%d", &n);
        for(int i = 0; i < n; i++)
        {
            cin >> tmp;
            ac.insert(tmp);
        }
        getchar();
        ac.build();
        getline(cin,tmp);
        int ans = ac.query(tmp);
        if(ans == 0)
            printf("NO
    ");
        else
            printf("YES
    ");
        return 0;
    }
    
    
  • 相关阅读:
    kafka集群搭建
    数据导入 xls --》mysql
    Spark --RDD算子
    Spark集群搭建
    【已解决】 IDEA运行spark程序报错:GC overhead limit exceeded?
    Spring Boot 配置 ---02
    Spring Boot 入门 ---01
    Nginx 推流 拉流 --- 点播直播
    【转】JS内置对象方法
    MapReduce 简单数据统计
  • 原文地址:https://www.cnblogs.com/Alruddy/p/7467861.html
Copyright © 2011-2022 走看看