hdu2222

原创 2015年07月10日 21:29:44

AC自动机模板

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

const int MAXN = 240005;
const int MAXL = 1000005;   

struct ACM
{
    int ch[MAXN][26], cnt[MAXN], f[MAXN], last[MAXN], q[MAXN];
    int sz, h, r;
    void init()
    {   
        sz = 0;
        memset(ch, 0, sizeof(ch));
        memset(cnt, 0, sizeof(cnt));
    }
    void insert(char *s)
    {
        register int x = 0, d, i;
        for(i = 0; s[i]; ++i)
        {
            d = s[i] - 'a';
            if(!ch[x][d]) ch[x][d] = ++sz;
            x = ch[x][d];
        }
        ++cnt[x];
    }
    void build()
    {
        register int d, x, y, z, h, r;
        h = r = 0;
        f[0] = 0;
        for(d = 0; d < 26; ++d)
        {
            x = ch[0][d];
            if(x) f[x] = last[x] = 0, q[r++] = x;
        }
        while(h < r)
        {
            x = q[h++];
            for(d = 0; d < 26; ++d)
            {
                y = ch[x][d], z = f[x];
                if(!y) { ch[x][d] = ch[z][d]; continue; }
                q[r++] = y;
                while(z && !ch[z][d]) z = f[z];
                f[y] = ch[z][d];
                last[y] = cnt[f[y]] ? f[y] : last[f[y]];
            }
        }
    }
    void add(int j, int &ans)
    {
        while(j && cnt[j]) ans += cnt[j], cnt[j] = 0, j = last[j];
    }
    int find(char *s)
    {
        register int i, j, d, ans = 0;
        for(i = j = 0; s[i]; ++i)
        {
            d = s[i] - 'a', j = ch[j][d];
            if(cnt[j]) add(j, ans); else if(last[j]) add(last[j], ans);
        }
        return ans;
    }
}ac;

int main()
{
#ifndef ONLINE_JUDGE
    freopen("input.txt", "r", stdin);
    freopen("output.txt", "w", stdout);
#endif

    static char o[55], s[MAXL];
    register int i, T, n; scanf("%d", &T);
    while(T--)
    {
        scanf("%d", &n), ac.init();
        for(i = 1; i <= n; ++i)
        {
            scanf("%s", o);
            ac.insert(o);
        }
        ac.build();
        scanf("%s", s);
        printf("%d\n", ac.find(s));
    }

#ifndef ONLINE_JUDGE
    fclose(stdin), fclose(stdout);
#endif
    return 0;
}

【HDU2222】【AC自动机模板 测烂为止】Keywords Search

传送门:HDU222 描述: Keywords Search Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/1310...

【hdu 2222】Keywords Search 中文题意&题解&代码(C++)

AC自动机入门题,模板题
  • DERITt
  • DERITt
  • 2016年02月19日 20:32
  • 625

hdu2222,(ac自动机)

网上讲解很多,其实自己可以模拟一遍,就能明白 #include #include #include #include using namespace std; const int maxn=5000...

HDU2222【AC自动机(基础·模板)】

Frist AC zi dong ji(Aho-Corasick Automation) of life #include using namespace std; const int N=5e...

HDU 2222 AC自动机 解题报告

Keywords SearchProblem DescriptionIn the modern time, Search engine came into the life of everybody ...

[hdu2222] AC自动机 数组版

Keywords SearchTime Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)...

【AC自动机】HDU2222Keywords Search

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2222 这个题目刚开始还不会,但是轮到了我给我同学讲课,之前就有看过,一直都没懂。就唯一的知道要会AC自...
  • wlxsq
  • wlxsq
  • 2015年11月10日 21:55
  • 314

HDU 2222 Keywords Search(AC自动机)

请不要随便指点别人该怎么做、每个人的人生都应该自己掌握、你给不了别人一切、你也不懂别人的忧伤、                                                  ...

HDU2222-Keywords Search AC自动机

HDU2222-Keywords Search AC自动机算法

HDU 2222 ac自动机入门模板题

Keywords Search Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Other...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:hdu2222
举报原因:
原因补充:

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