hdu2222 AC自动机入门

其实很久以来我都把sam当成ac自动机了

ac自动机的建立比sam简单多了

直接暴力建字典树,然后暴力跑fail就好了

(挖个坑:去学fail树)

裸题A一道,岂不美哉

 1 #include <bits/stdc++.h>
 2 #define MAX 1000000
 3 using namespace std;
 4 int T,n;char ch;
 5 struct acm
 6 {
 7     int cnt,h,t,c[MAX][26],fail[MAX],que[MAX],ret[MAX];
 8     void cl(int now)
 9     {
10         for(int i=0;i<26;i++)
11             c[now][i]=0;
12         ret[now]=0;
13     }
14     void clear()
15     {
16         cnt=1;
17         cl(1);
18     }
19     int ins(int now,int pa)
20     {
21         if(c[now][pa]) return c[now][pa];
22         else
23         {
24             c[now][pa]=++cnt;
25             cl(c[now][pa]);
26             return c[now][pa];
27         }
28     }
29     void mark(int now)
30     {
31         ++ret[now];
32     }
33     int go(int now,int pa)
34     {
35         if(c[now][pa]) return c[now][pa];
36         else return now>1?go(fail[now],pa):1;
37     }
38     void init()
39     {
40         for(fail[1]=que[1]=h=t=1;h<=t;h++)
41             for(int i=0;i<26;i++)
42                 if(c[que[h]][i])
43                 {
44                     int T;
45                     for(T=fail[que[h]];T>1 && !c[T][i];T=fail[T]);
46                     if((T==1 && !c[T][i])||(h==1)) fail[c[que[h]][i]]=1;
47                     else fail[c[que[h]][i]]=c[T][i];
48                     que[++t]=c[que[h]][i];
49                 }
50     }
51     int count(int now)
52     {
53         if(now==1 || ret[now]==-1) return 0;
54         int rt=count(fail[now])+ret[now];
55         ret[now]=-1;
56         return rt;
57     }
58 } a;
59 int main()
60 {
61     for(scanf("%d",&T);T;T--)
62     {
63         scanf("%d",&n);
64         a.clear();
65         for(int i=1;i<=n;i++)
66         {
67             for(ch=getchar();!isalpha(ch);ch=getchar());
68             int now=1;
69             for(;isalpha(ch);ch=getchar())
70                 now=a.ins(now,ch-‘a‘);
71             a.mark(now);
72         }
73         a.init();
74         int now=1,ans=0;
75         for(ch=getchar();!isalpha(ch);ch=getchar());
76         for(;isalpha(ch);ch=getchar())
77             now=a.go(now,ch-‘a‘),
78             ans+=a.count(now);
79         printf("%d\n",ans);
80     }
81     return 0;
82 }
时间: 2024-11-06 10:53:17

hdu2222 AC自动机入门的相关文章

hdu 2222 Keywords Search(AC自动机入门)

Keywords Search Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 42138    Accepted Submission(s): 13289 Problem Description In the modern time, Search engine came into the life of everybody like

hdoj 2222 Keywords Search 【AC自动机 入门题】

Keywords Search Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Total Submission(s): 44687    Accepted Submission(s): 14103 Problem Description In the modern time, Search engine came into the life of everybody li

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

AC自动机入门 Aho-Corasick automaton,该算法在1975年产生于贝尔实验室,是著名的多模匹配算法之一.学习AC自动机之前得先有Trie树和KMP模式匹配算法的基础. AC自动机算法分为3步:1.构造一棵tire树  2.构造失败指针  3.进行模式匹配 AC自动机的优化:Trie图 Keywords Search Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Other

hdu2222 AC自动机-给定串中出现了几个模式串

http://acm.hdu.edu.cn/showproblem.php?pid=2222 Problem Description In the modern time, Search engine came into the life of everybody like Google, Baidu, etc. Wiskey also wants to bring this feature to his image retrieval system. Every image have a lo

HDU 2222 Keywords Search AC自动机入门题

单词统计的题目,给出一些单词,统计有多少单词在一个文本中出现,最经典的入门题了. AC自动机的基础: 1 Trie, 以这个数据结构为基础的,不过增加一个fail指针和构造fail的函数 2 KMP,不是直接运用KMP,而是需要KMP的思想,KMP思想都没有的话,理解这个算法会更加吃力的. 注意本题的单词会有重复出现的,一个单词只能统计一次. 搜索了一下网上的题解,发现好多代码都是一大抄的啊,⊙﹏⊙b汗. 本博客的乃是原创代码,代码风格也是差不多固定的,转载请注明出处:http://blog.c

AC自动机入门和几道例题

一直被AC自动机这个名字唬住,以为很难,自动AC?其实不是.数模还有CA自动机(元胞自动机),听起来也怪吓人的,对ACM选手来说,算是一种模拟. AC自动机=字典树+KMP.字典树是必须要懂的:KMP主要了解一下回溯思想,问题不大. KMP解决的是一个母串和一个模式串的匹配问题. 字典树解决的是许多字符串的前缀和问题. AC自动机解决的是一个母串和许多模式串的匹配问题,把所有的模式串搞成一棵字典树,再用母串去字典树上跑. 引入失配指针的概念,对于当前遍历到的母串某个字符,在字典树中找不下去了,不

HDU2222 AC自动机

Keywords Search Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total Submission(s): 59781    Accepted Submission(s): 19700 Problem Description In the modern time, Search engine came into the life of everybody lik

hdu2222(ac自动机模板)

先推荐两篇写的很好的ac自动机blog: http://blog.csdn.net/creatorx/article/details/71100840 http://blog.csdn.net/niushuai666/article/details/7002823 正题 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2222 题意: 给出 n 个模式串以及一个 主串, 问有多少个模式串在主串中出现过 思路: ac自动机模板题 代码: 1 #inc

[hdu2222]ac自动机(模板)

题意:一个文本串+多个模板串的匹配问题 思路:裸的ac自动机. 1 #pragma comment(linker, "/STACK:10240000,10240000") 2 3 #include <iostream> 4 #include <cstdio> 5 #include <algorithm> 6 #include <cstdlib> 7 #include <cstring> 8 #include <map&g