AC自动机

原创 2015年07月09日 21:06:06

PS:http://www.cppblog.com/mythit/archive/2009/04/21/80633.html

PS:http://www.cnblogs.com/kuangbin/category/402395.html


#include<iostream>

#include<cstdio>
#include<string.h>
#include<string>
#include<set>
#include<algorithm>
#include<cmath>
#include<queue>

#define ll __int64
#define MAX 1000009

const int maxnode = MAX;
const int sigma_size = 26;
using namespace std;

struct Trie
{
    int ch[maxnode][sigma_size];
    int val[maxnode];
    int next[maxnode];
    int sz,root;
    int idx(char c)
    {
        return c - 'a';
    }
    int newnode()
    {
        for(int i = 0; i<26; i++)
            ch[sz][i] = 0;
        val[sz++] = 0;
        return sz - 1;
    }
    void init()
    {
        sz = 0;
        root = newnode();
    }
    void Insert(char* s)
    {
        int u = root;
        int n = strlen(s);
        for(int i = 0; i<n; i++)
        {
            int c = idx(s[i]);
            if(!ch[u][c])
                ch[u][c] = newnode();
            u = ch[u][c];
        }
        val[u]++;
    }
    void build()
    {
        queue<int>Q;
        next[root] = root;
        for(int i = 0; i<26; i++)
        {
            if(!ch[root][i])
            {
                ch[root][i] = root;
            }
            else
            {
                next[ch[root][i]] = root;
                Q.push(ch[root][i] );
            }
        }
        while(!Q.empty())
        {
            int now = Q.front();
            Q.pop();
            for(int i = 0; i<26; i++)
            {
                if(!ch[now][i])
                {
                    ch[now][i] = ch[next[now]][i];
                }
                else
                {
                    next[ch[now][i]] = ch[next[now]][i];
                    Q.push(ch[now][i]);
                }
            }
        }
    }
    int query(char* s)
    {
        int len = strlen(s);
        int now = root;
        int res = 0;
        for(int i = 0; i<len; i++)
        {
            int c = idx(s[i]);
            now = ch[now][c];
            int temp = now;
            while(temp!= root)
            {
                res+=val[temp];
                val[temp] = 0;
                temp = next[temp];
            }
        }
        return res;
    }
    void debug()
    {
        for(int i = 0; i<sz; i++)
        {
            printf("id = %3d,next = %3d,val = %3d,chi = [",i,next[i],val[i]);
            for(int j = 0; j < 26; j++)
                printf("%2d",ch[i][j]);
            printf("]\n");
        }
    }
};

char str[MAX];
Trie Ac;

int main()
{
    int T;
    int n;
    scanf("%d",&n);
    Ac.init();
    for(int i = 0; i<n; i++)
    {
        scanf("%s",str);
        Ac.Insert(str);
    }
    Ac.build();
    scanf("%s",str);
    // Ac.debug();
    if(Ac.query(str)>0)
    {
        puts("YES");
    }
    else
    {
        puts("NO");
    }
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

中文高性能AC自动机代码

  • 2017年11月05日 20:25
  • 17KB
  • 下载

hdu 3341(ac自动机+状态压缩)

  • 2013年10月29日 17:03
  • 23KB
  • 下载

hdu 3065 病毒侵袭持续中 ac自动机

点击打开链接题目链接 病毒侵袭持续中 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java...

AC自动机程序资料合集

  • 2011年05月10日 20:25
  • 149KB
  • 下载

AC自动机模板

  • 2015年12月08日 01:01
  • 1KB
  • 下载

【bzoj2434】阿狸的打字机 AC自动机+树状数组

2434: [Noi2011]阿狸的打字机 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 2460  Solved: 1379[Submit][Sta...

AC自动机.docx

  • 2015年12月22日 12:20
  • 21KB
  • 下载

AC自动机代码

  • 2016年06月14日 17:30
  • 1.91MB
  • 下载

AC自动机练习题(uva 1149 uva 11468)

这两天又刷了两道AC自动机的题:突然f

自己写的ac自动机,STL实现

  • 2011年08月29日 23:28
  • 3KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:AC自动机
举报原因:
原因补充:

(最多只允许输入30个字)