字典树 + 深搜 之 hdu 1298

//  [7/16/2014 Sjm]
/*
字典树 + 深搜。。。
(好久没碰搜索了,调试了一段时间,不过还好1A。。。)

*/

  1 #include <iostream>
  2 #include <cstdlib>
  3 #include <cstdio>
  4 #include <cstring>
  5 #include <algorithm>
  6 #include <map>
  7 #include <string>
  8 #include <functional>
  9 using namespace std;
 10 const int MAX = 26;
 11 
 12 map<int, string> my_map;
 13 string ans_str;
 14 int max_val;
 15 bool myJudge;
 16 
 17 struct Trie{
 18     int val;
 19     Trie* next[MAX];
 20     Trie(){
 21         val = 0;
 22         memset(next, NULL, sizeof(next));
 23     }
 24 };
 25 
 26 Trie* Root;
 27 
 28 void CreTrie(char* str, int t_val) {
 29     int len = strlen(str);
 30     Trie* p = Root;
 31     for (int i = 0; i < len; i++) {
 32         int pos = str[i] - 'a';
 33         if (!(p->next[pos])) {
 34             p->next[pos] = new Trie;
 35         }
 36         p->next[pos]->val += t_val;
 37         p = p->next[pos];
 38     }
 39 }
 40 
 41 void DelTrie(Trie* T)
 42 {
 43     for (int i = 0; i < MAX; i++) {
 44         if (T->next[i]) {
 45             DelTrie(T->next[i]);
 46         }
 47     }
 48     delete[] T;
 49 }
 50 
 51 void Dfs_Trie(char* str, int pos, Trie* p, string for_ans_str)
 52 {
 53     if (strlen(str) == pos) {
 54         myJudge = true;
 55         if (p->val > max_val) {
 56             ans_str = for_ans_str;
 57             max_val = p->val;
 58         }
 59         return;
 60     }
 61     int key = str[pos] - '0';
 62     int len = my_map[key].size();
 63     for (int i = 0; i < len; i++) {
 64         int now_node = my_map[key][i] - 'a';
 65         if (!(p->next[now_node])) {
 66             continue;
 67         }
 68         else {
 69             Dfs_Trie(str, pos + 1, p->next[now_node], for_ans_str + my_map[key][i]);
 70         }
 71     }
 72 }
 73 
 74 int main()
 75 {
 76     my_map[2] = "abc";    my_map[3] = "def";
 77     my_map[4] = "ghi";    my_map[5] = "jkl";
 78     my_map[6] = "mno";    my_map[7] = "pqrs";
 79     my_map[8] = "tuv";    my_map[9] = "wxyz";
 80     //freopen("input.txt", "r", stdin);
 81     //freopen("output.txt", "w", stdout);
 82     int N;
 83     scanf("%d", &N);
 84     char str[105], num[105];
 85     int w, m, val;
 86     for (int i = 1; i <= N; i++) {
 87         printf("Scenario #%d:\n", i);
 88 
 89         Root = new Trie;
 90 
 91         scanf("%d", &w);
 92         while (w--) {
 93             scanf("%s %d", str, &val);
 94             CreTrie(str, val);
 95         }
 96 
 97         scanf("%d", &m);
 98         while (m--){
 99             scanf("%s", num);
100             int len = strlen(num) - 1;
101             char t_str[105] = { '\0' };
102             for (int j = 1; j <= len; j++) {
103                 strncpy(t_str, num, j);
104                 myJudge = false;
105                 max_val = 0;
106                 Dfs_Trie(t_str, 0, Root, "");
107                 if (!myJudge) { printf("MANUALLY\n"); }
108                 else { cout << ans_str << endl; }
109             }
110             printf("\n");
111         }
112         printf("\n");
113         DelTrie(Root);
114     }
115     return 0;
116 }

 

posted @ 2014-07-16 14:00  JmingS  阅读(228)  评论(0编辑  收藏  举报