首页 > 代码库 > 【POJ】1451 T9

【POJ】1451 T9

DFS+字典树。

  1 #include <cstdio>  2 #include <cstring>  3 #include <cstdlib>  4   5 typedef struct Trie {  6     int v;  7     Trie *next[26];  8 } Trie;  9  10 Trie root; 11 int arr[11] = {0,0,0,3,6,9,12,15,19,22,26}; 12 char buf[105], tmp[105]; 13 char map[105][105]; 14 int max[105], len; 15  16 void create(char str[], int x) { 17     int i, j, id; 18     Trie *p = &root, *q; 19  20     for (i=0; str[i]!=\0; ++i) { 21         id = str[i] - a; 22         if (p->next[id] == NULL) { 23             q = (Trie *)malloc(sizeof(Trie)); 24             q->v = x; 25             for (j=0; j<26; ++j) 26                 q->next[j] = NULL; 27             p->next[id] = q; 28         } else { 29             p->next[id]->v += x; 30         } 31         p = p->next[id]; 32     } 33 } 34  35 void del(Trie *t) { 36     int i; 37  38     if (t == NULL) 39         return ; 40     for (i=0; i<26; ++i) 41         del(t->next[i]); 42     free(t); 43 } 44  45 void find(Trie *t, int ti, int step) { 46     int beg = arr[buf[step]-0]; 47     int end = arr[buf[step]-0+1]; 48     int i; 49  50     for (i=beg; i<end; ++i) { 51         if (t->next[i] == NULL) 52             continue; 53         tmp[ti] = i+a; 54         if (t->next[i]->v > max[step]) { 55             max[step] = t->next[i]->v; 56             tmp[ti+1] = \0; 57             strcpy(map[step], tmp); 58         } 59         if (step < len-1) 60             find(t->next[i], ti+1, step+1); 61     } 62 } 63  64 int main() { 65     int case_n, n, x; 66     int i, j, t; 67  68     scanf("%d", &case_n); 69  70     for (t=1; t<=case_n; ++t) { 71         for (i=0; i<26; ++i) 72             root.next[i] = NULL; 73         scanf("%d", &n); 74         while (n--) { 75             scanf("%s %d", buf, &x); 76             create(buf, x); 77         } 78         scanf("%d", &n); 79         printf("Scenario #%d:\n", t); 80         while (n--) { 81             scanf("%s", buf); 82             len = strlen(buf); 83             --len; 84             memset(max, -1, sizeof(max)); 85             find(&root, 0, 0); 86             for (i=0; i<len; ++i) { 87                 if (max[i] == -1) 88                     break; 89                 printf("%s\n", map[i]); 90             } 91             for (j=i; j<len; ++j) 92                 printf("MANUALLY\n"); 93             printf("\n"); 94         } 95         printf("\n"); 96         del(&root); 97     } 98  99     return 0;100 }