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 SearchTime Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)...

HDU 2222 Keywords Search

比较裸的AC自动机。 借鉴:http://www.cppblog.com/mythit/archive/2009/04/21/80633.html #include #include #inc...

【AC自动机】HDU2222Keywords Search

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

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...

AC自动机模板——HDU2222 Keywords Search

Keywords Search Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Oth...

我的ac自动机第一题 hdu2222

#include #include #include #include #include #include #include #include #include #include ...

HDU 2222 Keywords Search (AC自动机入门题)

题意: 题解: //先调用PreProcess()初始化 //Insert()添加串 Find()查找串 //get(char s) 返回字符s所对应的编号(考虑字符集合可能是’A’-’Z’或者...
  • Tsaid
  • Tsaid
  • 2012-10-10 23:13
  • 446

hdu 2222

AC自动机 要求对一个wen
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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