hdu3065 AC自动机

hdu3065

题意:给出n个病毒串(模式串),再给出一个待匹配串,问每种模式串在其中出现了几次,0次不输出

也是将AC自动机的模板稍微修改了一下,由于每个模式串都不同,所以直接用cnt数组记录结点代表的模式串的标号,在匹配串时计数就可以了

 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<queue>
 4 using namespace std;
 5 const int maxm=1010*55;
 6
 7 char s[2000000+50],word[1010][55];
 8 int c;
 9 int vis[1010];
10 int nxt[maxm][128-30],cnt[maxm],fail[maxm],size;
11
12 int newnode(){
13     memset(nxt[size],0,sizeof(nxt[size]));
14     fail[size]=cnt[size]=0;
15     return size++;
16 }
17
18 void insert(char s[],int k){
19     int i,p=0;
20     for(i=0;s[i];i++){
21         int &x=nxt[p][s[i]-30];
22         p=x?x:x=newnode();
23     }
24     cnt[p]=k;
25 }
26
27 void makenxt(){
28     int i;
29     queue<int>q;
30     q.push(0);
31     while(!q.empty()){
32         int u=q.front();
33         q.pop();
34         for(i=0;i<128-30;i++){
35             int v=nxt[u][i];
36             if(v==0)nxt[u][i]=nxt[fail[u]][i];
37             else q.push(v);
38             if(u&&v){
39                 fail[v]=nxt[fail[u]][i];
40             }
41         }
42     }
43 }
44
45 void query(char s[]){
46     int d=0;
47     for(int i=0;s[i];i++){
48         d=nxt[d][s[i]-30];
49         int tmp=d;
50         while(tmp!=0){
51             vis[cnt[tmp]]++;
52             tmp=fail[tmp];
53         }
54     }
55 }
56
57 int main(){
58     int n;
59     while(scanf("%d",&n)!=EOF){
60         size=0,newnode();
61         int i;
62         memset(cnt,0,sizeof(cnt));
63         memset(vis,0,sizeof(vis));
64         for(i=1;i<=n;i++){
65             scanf("%s",word[i]);
66             insert(word[i],i);
67         }
68         makenxt();
69         scanf("%s",s);
70         query(s);
71         for(i=1;i<=n;i++){
72             if(vis[i])printf("%s: %d\n",word[i],vis[i]);
73         }
74     }
75     return 0;
76 }

hdu3065

时间: 2024-11-04 19:31:26

hdu3065 AC自动机的相关文章

HDU3065(AC自动机入门题)

病毒侵袭持续中 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 9831    Accepted Submission(s): 3457 Problem Description 小t非常感谢大家帮忙解决了他的上一个问题.然而病毒侵袭持续中.在小t的不懈努力下,他发现了网路中的“万恶之源”.这是一个庞大的病毒网站,他有着好多好多的病毒,但是

hdu3065 病毒侵袭持续中 AC自动机入门题 N(N &lt;= 1000)个长度不大于50的模式串(保证所有的模式串都不相同), 一个长度不大于2000000的待匹配串,求模式串在待匹配串中的出现次数。

/** 题目:hdu3065 病毒侵袭持续中 链接:http://acm.hdu.edu.cn/showproblem.php?pid=3065 题意:N(N <= 1000)个长度不大于50的模式串(保证所有的模式串都不相同), 一个长度不大于2000000的待匹配串,求模式串在待匹配串中的出现次数. 思路:ac自动机做发,val标记每一个病毒串编号,通过print函数统计每一个病毒出现的次数. AC自动机好文章:http://www.cppblog.com/menjitianya/archi

【HDU3065】 病毒侵袭持续中(AC自动机)

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 10504    Accepted Submission(s): 3701 Problem Description 小t非常感谢大家帮忙解决了他的上一个问题.然而病毒侵袭持续中.在小t的不懈努力下,他发现了网路中的“万恶之源”.这是一个庞大的病毒网站,他有着好多好多的病毒,但是这个网站包含的

【小结】AC自动机

参考资料:http://blog.csdn.net/niushuai666/article/details/7002823 搞了两天,突然明白,这玩意它原来就是个DFA鸭!窝来分析分析 从DFA到AC自动机: 考虑以下单词: {she, he, her},字母表∑为26个小写字母 我们先画出它Trie树的模样 注意,双圈的是包含单词结尾的位置.然后我们尝试将它稍加改造,变成一个DFA! 对每一个状态,必须补充下一个字母为其它(比如从起始状态出发,输入一个h,匹配上了,接下来输入可能为a-z,我们

暑假集训day9补充(AC自动机)

推荐网站http://blog.csdn.net/niushuai666/article/details/7002823 AC自动机嘛,此AC(aho-corasick)非彼AC(Accepted). 我也不是很会解释 有一题是必须打的hdu2222. #include<iostream> #include<cstdio> #include<cstring> #include<queue> using namespace std; const int mn=

ac自动机基础模板(hdu2222)

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 long description, when users type some keywords to find the image, th

HDU 2825 Wireless Password AC自动机+dp

训练赛第二场的I题,上完体育课回来就把这题过了,今天训练赛rank1了,还把大大队虐了,而且我还过了这道题 (虽然我也就过了这道题...),第一次在比赛中手写AC自动机还带dp的,心情大好. 给一个字符串集合,求包含该集合超过K个字符的,长度为L的字符串的个数. 显然是在AC自动机上跑dp,设dp[u][L][k]表示当前在结点u,还要走L步,当前状态为k的个数.一开始第三维表示的是包含k个字符串,但是题目要求不含重复的,那就只能状压了.转移为dp[u][L][k]+=dp[v][L-1][nk

HDU 2896-病毒侵袭(ac自动机)

题意: 给定多个模式串,每给一个母串,输出包含模式串的编号,最后输出包含模式串的母串的数量. 分析: ac自动机模板 #include <map> #include <set> #include <list> #include <cmath> #include <queue> #include <stack> #include <cstdio> #include <vector> #include <st

hdu2222 Keywords Search &amp; AC自动机学习小结

传送门:http://http://acm.hdu.edu.cn/showproblem.php?pid=2222 思路:AC自动机入门题,直接上AC自动机即可. 对于构建AC自动机,我们要做的只有三件事: 1)构建字典树 2)构建失败指针 3)构建trie图(这道题好像不做这一步也能A...但是这一步不做是会被卡成O(n^2)的...) 1)第一步还是比较好理解的 根是虚根,边代表字母,那么根到终止节点的路径就是一个字符串,这样对于前缀相同的字符串我们就可以省下存公共前缀的空间. 加入一个模式