hdu 1251(tire 树的简单应用)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1251

题意:给你多个字符串,求以某个字符串为前缀的字符串数量。

思路:简单的tire数应用,在tire的数据结构中增加一个存储到当前节点字符串出现的次数,在插入的过程中维护即可。

code:

 1 #include <cstdio>
 2 #include <cstring>
 3 const int KIND = 26;
 4 struct TireNode
 5 {
 6     int num;     // 遍历到该结点形成的字符串出现的次数
 7     TireNode* next[KIND];
 8     TireNode()
 9     {
10         num = 1;
11         for (int i = 0; i < KIND; ++i) next[i] = NULL;
12     }
13 };
14
15 TireNode* root = NULL;
16
17 void Insert(char* x)
18 {
19     TireNode* temp = root;
20     if (root == NULL)   // 预判
21     {
22         temp = new TireNode();
23         root = temp;
24     }
25     int len = strlen(x);
26     for (int i = 0; i < len; ++i)
27     {
28         int curr = x[i] - ‘a‘;
29         if (temp->next[curr] != NULL) ++(temp->next[curr]->num);  // 已经存在
30         else temp->next[curr] = new TireNode();  // 不存在
31         temp = temp->next[curr];
32     }
33 }
34
35 int Search(char* x)
36 {
37     int ret = 0;
38     if (root == NULL) return ret;   // 预判
39     TireNode* temp = root;
40     int len = strlen(x);
41     for (int i = 0; i < len; ++i)
42     {
43         int curr = x[i] - ‘a‘;
44         if (temp->next[curr] == NULL) return 0;
45         temp = temp->next[curr];
46         ret = temp->num;
47     }
48     return ret;
49 }
50
51 void Release(TireNode* root)
52 {
53     if (NULL == root) return;
54     for (int i = 0; i < KIND; ++i)
55     {
56         if (root->next[i] != NULL)
57             Release(root->next[i]);
58     }
59     delete root;
60     root = NULL;
61 }
62
63 int main()
64 {
65     char str[10];
66     while (gets(str))
67     {
68         if (str[0] == ‘\0‘)
69         {
70             while (gets(str))
71                 printf("%d\n", Search(str));
72         }
73         else Insert(str);
74     }
75     Release(root);
76     return 0;
77 }
时间: 2024-12-28 21:36:19

hdu 1251(tire 树的简单应用)的相关文章

HDU 1251 字典树入门

统计难题 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131070/65535 K (Java/Others)Total Submission(s): 17177    Accepted Submission(s): 7410 Problem Description Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现),现在老师要他统计出以某个字符串为前缀的单词数量(单词本身也是自己的前

HDU 1251 Trie树模板题

1.HDU 1251 统计难题  Trie树模板题,或者map 2.总结:用C++过了,G++就爆内存.. 题意:查找给定前缀的单词数量. #include<iostream> #include<cstring> #include<cmath> #include<queue> #include<algorithm> #include<cstdio> #define max(a,b) a>b?a:b #define F(i,a,b

HDU 4825 tire树

Xor Sum Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 132768/132768 K (Java/Others)Total Submission(s): 2505    Accepted Submission(s): 1076 Problem Description Zeus 和 Prometheus 做了一个游戏,Prometheus 给 Zeus 一个集合,集合中包含了N个正整数,随后 Prometheus 将向 Ze

hdu 1251 trie树

统计难题 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131070/65535 K (Java/Others) Problem Description Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现),现在老师要他统计出以某个字符串为前缀的单词数量(单词本身也是自己的前缀). Input 输入数据的第一部分是一张单词表,每行一个单词,单词的长度不超过10,它们代表的是老师交给Igna

hdu 1251 字典树的应用

这道题看了大神的模板,直接用字典树提交的会爆内存,用stl 里的map有简单有快 #include <iostream> #include <map> #include <cstring> #include <string> using namespace std; int main() { int i, len; char str[10]; map<string, int> m; while( gets(str) ) { len = strle

hdu 1251(字典树)

统计难题 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131070/65535 K (Java/Others)Total Submission(s): 29183    Accepted Submission(s): 11454 Problem Description Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现),现在老师要他统计出以某个字符串为前缀的单词数量(单词本身也是自己的

HDU 1251 统计难题(trie简单应用)

统计难题 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131070/65535 K (Java/Others)Total Submission(s): 25579    Accepted Submission(s): 10451 Problem Description Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现),现在老师要他统计出以某个字符串为前缀的单词数量(单词本身也是自己的

hdu 1251 字典树模板题 ---多串 查找单词出现次数

这道题题目里没有给定数据范围 我开了2005  疯狂的WA 然后开了50000, A掉  我以为自己模板理解错  然后一天没吃饭,饿得胃疼还是想着把这题A掉再去吃,谁知竟然是这样的问题,,,呵呵~~~ 只是记录下这道题学到的方法吧: for(rt = 0; *s; rt = nxt, ++s) { nxt=tree[rt][*s-tb]; if(!nxt) { nxt=tree[rt][*s-tb]=top; memset(tree[top],0,sizeof(tree[top])); top+

hdu 1251 统计难题 (字典树入门题)

1 /******************************************************* 2 题目: 统计难题 (hdu 1251) 3 链接: http://acm.hdu.edu.cn/showproblem.php?pid=1251 4 算法: 字典树 5 提示: 这题压要用c++提交,G++会超内存 6 *******************************************************/ 7 #include<cstdio> 8