HDU 5384 字典树、AC自动机

题目:http://acm.hdu.edu.cn/showproblem.php?pid=5384

用字典树、AC自动机两种做法都可以做

 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<string>
 4 #include<iostream>
 5 using namespace std;
 6 struct node{
 7     int cnt;
 8     node *next[26];
 9     node(){
10         cnt = 0;
11         for(int i = 0;i<26;i++)
12             next[i] = NULL;
13     }
14 }*a;
15 void insert(char *str){
16     node *head = a;
17     int len = strlen(str);
18     for(int i = 0;i<len;i++){
19         int temp = str[i]-‘a‘;
20         if(head->next[temp] == NULL)
21             head->next[temp] = new node;
22         head = head->next[temp];
23     }
24     head->cnt++;
25 }
26 int find(string t){
27     node *head = a;
28     int ans = 0;
29     for(int i = 0;i<t.size();i++){
30         if(head->next[t[i]-‘a‘]){
31             if(head->next[t[i]-‘a‘]->cnt){
32                 ans++;
33
34             }
35         }else
36             break;
37         head = head->next[t[i]-‘a‘];
38     }
39     head->cnt--;
40     return ans;
41 }
42 int main(){
43     int t;
44     scanf("%d",&t);
45     while(t--){
46         a = new node;
47         int n;
48         scanf("%d",&n);
49         char s[55];
50         for(int i = 0;i<n;i++){
51             scanf(" %s",s);
52             insert(s);
53         }
54         string des;
55         cin >> des;
56         int ans = 0;
57         for(int i = 0;i<des.size();i++){
58             ans += find(des.substr(i));
59         }
60         printf("%d\n",ans);
61     }
62     return 0;
63 }

字典树

 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<string>
 4 #include<iostream>
 5 using namespace std;
 6 struct node{
 7     int cnt;
 8     node *next[26];
 9     node(){
10         cnt = 0;
11         for(int i = 0;i<26;i++)
12             next[i] = NULL;
13     }
14 }*a;
15 void insert(char *str){
16     node *head = a;
17     int len = strlen(str);
18     for(int i = 0;i<len;i++){
19         int temp = str[i]-‘a‘;
20         if(head->next[temp] == NULL)
21             head->next[temp] = new node;
22         head = head->next[temp];
23     }
24     head->cnt++;
25 }
26 int find(string t){
27     node *head = a;
28     int ans = 0;
29     for(int i = 0;i<t.size();i++){
30         if(head->next[t[i]-‘a‘]){
31             if(head->next[t[i]-‘a‘]->cnt){
32                 ans++;
33
34             }
35         }else
36             break;
37         head = head->next[t[i]-‘a‘];
38     }
39     head->cnt--;
40     return ans;
41 }
42 int main(){
43     int t;
44     scanf("%d",&t);
45     while(t--){
46         a = new node;
47         int n;
48         scanf("%d",&n);
49         char s[55];
50         for(int i = 0;i<n;i++){
51             scanf(" %s",s);
52             insert(s);
53         }
54         string des;
55         cin >> des;
56         int ans = 0;
57         for(int i = 0;i<des.size();i++){
58             ans += find(des.substr(i));
59         }
60         printf("%d\n",ans);
61     }
62     return 0;
63 }

AC自动机

时间: 2024-10-22 03:22:49

HDU 5384 字典树、AC自动机的相关文章

hdu 5384 Danganronpa(基础AC自动机)

题意:多个模式串和多个待匹配串,求每个待匹配串对于所有模式串的匹配个数: 思路:1.与最裸的ac自动机的区别在于讯问后的叶子节点的count值会改变,在每次询问时count值不要清零: 2.对于多个串的保存直接用二维数组: #include<cstdio> #include<vector> #include<iostream> #include<algorithm> #include<cstring> using namespace std; c

HDU 5384——Danganronpa——————【AC自动机】

Danganronpa Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total Submission(s): 582    Accepted Submission(s): 323 Problem Description Danganronpa is a video game franchise created and developed by Spike Chunsoft

HDU 5384 Danganronpa(AC自动机)

Danganronpa Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Total Submission(s): 429    Accepted Submission(s): 248 Problem Description Danganronpa is a video game franchise created and developed by Spike Chunsof

hdu 1075 字典树

// hdu 1075 字典树 // // 题目大意: // // 给你一个字典,即有两个字符串,一个是英文,一个是火星文,然后 // 输入一段火星文,要你翻译成英文. // // 解题思路: // // 字典树,查字典嘛,有就输出查到的,没有原样输出.将火星文插入到 // 字典树中,然后在字典输中查找.找到了,输出对应的英文,否则,原样输 // 出. // // 感悟: // // 题目确实很简单,但是,没告诉数据范围啊,导致我一直RE,原来单词 // 可能对应很长的英文啊,找人家ac的开数组

HDU 2896 病毒侵袭 AC自动机题解

本题是在text里面查找key word的增强版,因为这里有多个text. 那么就不可以简单把Trie的叶子标志记录修改成-1进行加速了,可以使用其他技术,我直接使用个vis数组记录已经访问过的节点,达到加速效果,速度还算挺快的. 不过看discuss里面有人直接使用Trie,做出了140ms的速度,而且他的程序严格来说并不正确,可见本题的数据很水啊.Trie的时间效率肯定比AC自动机低,但是在数据很水的特殊情况下,Trie的速度也可以很快的. 注意两个细节: 1 病毒也需要安装顺序输出,不小心

HDU 1800 字典树

Flying to the Mars Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 10065    Accepted Submission(s): 3270 Problem Description In the year 8888, the Earth is ruled by the PPF Empire . As the popul

hdu 2896 病毒侵袭 AC自动机(查找包含哪些子串)

病毒侵袭 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 19465    Accepted Submission(s): 4814 Problem Description 当太阳的光辉逐渐被月亮遮蔽,世界失去了光明,大地迎来最黑暗的时刻....在这样的时刻,人们却异常兴奋——我们能在有生之年看到500年一遇的世界奇观,那是多么幸福的事儿

HDU 2222 Keyword Search AC自动机模板

#include <algorithm> #include <iostream> #include <cstring> #include <cstdlib> #include <cstdio> #include <queue> #include <cmath> #include <stack> #include <map> #include <ctime> #include <io

hdu 2825 Wireless Password(ac自动机&amp;dp)

Wireless Password Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 4022    Accepted Submission(s): 1196 Problem Description Liyuan lives in a old apartment. One day, he suddenly found that there