Why so serious? --[NKU]schindlerlee

pku1451 trie树

很久没更新了,题刷了不少,但是一直没怎么总结先贴一篇
  1
 /* 
  2  * SOUR:pku 1451
  3  * ALGO:trie
  4  * DATE: 2009年 08月 17日 星期一 13:29:46 CST
  5  * COMM:3
  6  * */
  7 #include<iostream>
  8 #include<cstdio>
  9 #include<cstdlib>
 10 #include<cstring>
 11 #include<algorithm>
 12 using namespace std;
 13 #define inf 0x7fffffff
 14 #define debug 1
 15 const int N = 1000 * 11;
 16 int mov[10][5=
 17     { {-1}, {-1}, {012-1}, {345-1}, {678-1}, {91011-1},
 18 {121314-1}, {15161718-1}, {192021-1}, {22232425-1}
 19 };
 20 
 21 struct Trie {
 22     int c;
 23     Trie *next[26];
 24      Trie() {
 25         c = 0;
 26         memset(next, 0sizeof(next));
 27     }
 28     void insert(char *s, int f);
 29     void getMax(char *s, int step, int len);
 30 *root, pool[N];
 31 int pt;
 32 void Trie::insert(char *s, int f)
 33 {
 34     c += f;
 35     if (*== 0)
 36         return;
 37     if (next[*- 'a'== NULL) {
 38         next[*- 'a'= &pool[pt++];
 39     }
 40     next[*- 'a']->insert(s + 1, f);
 41 }
 42 
 43 char tmp[61], res[61];
 44 int freq;
 45 void Trie::getMax(char *s, int step, int len)
 46 {
 47     if (step >= len) {
 48         tmp[len] = 0;
 49         if (c > freq) {
 50             //strcpy(res, tmp);
 51             for (int i = 0; i <= len; i++) {
 52                 res[i] = tmp[i];
 53             }
 54             freq = c;
 55         }
 56         return;
 57     }
 58 
 59     int idx;
 60     for (int i = 0; mov[*- '0'][i] >= 0; i++) {
 61         idx = mov[*- '0'][i];
 62         if (next[idx] != NULL) {
 63             tmp[step] = idx + 'a';
 64             next[idx]->getMax(s + 1, step + 1, len);
 65         }
 66     }
 67 }
 68 
 69 int main()
 70 {
 71     int i, k, C, D, f;
 72     char buf[30];
 73     scanf("%d"&C);
 74     for (k = 1; k <= C; k++) {
 75         root = &pool[0];
 76         pt = 1, memset(pool, 0sizeof(pool));
 77         printf("Scenario #%d:\n", k);
 78         scanf("%d"&D);
 79         while (D-- > 0) {
 80             scanf("%s %d", buf, &f); //哥一开始buf开小了,报了stack smashing 。。。。。。。。
 81             root->insert(buf, f);
 82         }
 83         scanf("%d"&D), getchar();
 84         while (D-- > 0) {
 85             scanf("%s", buf);
 86             buf[strlen(buf) - 1= 0;
 87 
 88             int len = strlen(buf);
 89             for (i = 1; i <= len; i++) {
 90                 freq = 0;
 91                 root->getMax(buf, 0, i);
 92                 if (freq > 0) {
 93                     printf("%s\n", res);
 94                 } else {
 95                     puts("MANUALLY");
 96                 }
 97             }
 98             printf("\n");
 99         }
100         printf("\n");
101     }
102     return 0;
103 }
104 

posted on 2009-08-17 22:26 schindlerlee 阅读(1550) 评论(2)  编辑 收藏 引用 所属分类: 解题报告

Feedback

# re: pku1451 trie树 2009-08-18 09:44 戴尔笔记本

很好  回复  更多评论   

# re: pku1451 trie树 2009-08-19 14:36 99读书人

不错啊!  回复  更多评论   


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理