• AC自动机模板 hdu2222


    #include <bits/stdc++.h>
    using namespace std;
    
    struct Aho
    {
        int next[500010][26],fail[500010],cnt[500010];
        int root,L;
        int newnode()
        {
            for(int i = 0;i < 26;i++)
                next[L][i] = -1;
            cnt[L++] = 0;
            return L-1;
        }
        void init()
        {
            L = 0;
            root = newnode();
        }
        void insert(char buf[])
        {
            int len=strlen(buf);
            int now=root;
            for(int i = 0;i < len;i++){
                if(next[now][buf[i]-'a'] == -1)
                    next[now][buf[i]-'a'] = newnode();
                now = next[now][buf[i]-'a'];
            }
            cnt[now]++;
        }
        void build(){
            queue<int>Q;
            fail[root] = root;
            for(int i = 0;i < 26;i++)
                if(next[root][i] == -1)
                    next[root][i] = root;
                else{
                    fail[next[root][i]] = root;
                    Q.push(next[root][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(char buf[])
        {
            int len = strlen(buf);
            int now = root;
            int res = 0;
            for(int i = 0;i < len;i++){
                now = next[now][buf[i]-'a'];
                int temp = now;
                while( temp != root ){
                    res += cnt[temp];
                    cnt[temp] = 0;
                    temp = fail[temp];
                }
            }
            return res;
        }
    //    void debug()
    //    {
    //        for(int i = 0;i < L;i++){
    //            printf("id = %3d,fail = %3d,cnt = %3d,chi = [",i,fail[i],cnt[i]);
    //            for(int j = 0;j < 26;j++)
    //                printf("%2d",next[i][j]);
    //            printf("]
    ");
    //        }
    //    }
    }aho;
    
    char buf[1000010];
    int main()
    {
        int T;
        int n;
        scanf("%d",&T);
        while(T--){
            scanf("%d",&n);
            aho.init();
            for(int i = 0;i < n;i++){
                scanf("%s",buf);
                aho.insert(buf);
            }
            aho.build();
            scanf("%s",buf);
            printf("%d
    ",aho.query(buf));
        }
        return 0;
    }
  • 相关阅读:
    ReentrantLock-公平锁、非公平锁、互斥锁、自旋锁
    行动的阻碍
    AQS-等待队列
    AQS-volatile、CAS
    UML类图符号
    最小堆
    红黑树
    Java面试题-Collection框架
    Java面试题-Java特性
    Qt QString中文 char* UTF-8 QByteArray QTextCodec unicode gb2312 GBK 乱码和转码问题
  • 原文地址:https://www.cnblogs.com/lalalatianlalu/p/8360999.html
Copyright © 2020-2023  润新知