hdu 1251 统计难题(trie 树的简单应用)

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

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

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

code:

 1 #include <cstdio>
 2 #include <cstring>
 3 const int KIND = 26;
 4 struct TrieNode
 5 {
 6     int num;     // 遍历到该结点形成的字符串出现的次数
 7     TrieNode* next[KIND];
 8     TrieNode()
 9     {
10         num = 1;
11         for (int i = 0; i < KIND; ++i) next[i] = NULL;
12     }
13 };
14 
15 TrieNode* root = NULL;
16 
17 void Insert(char* x)
18 {
19     TrieNode* temp = root;
20     if (root == NULL)   // 预判
21     {
22         temp = new TrieNode();
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 TrieNode();  // 不存在
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     TrieNode* 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(TrieNode* 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 }

 

posted @ 2015-05-06 21:49  jasaiq  阅读(225)  评论(0编辑  收藏  举报