pku1451 trie树

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 }, { 0 1 2 - 1 }, { 3 4 5 - 1 }, { 6 7 8 - 1 }, { 9 10 11 - 1 },
 18  { 12 13 14 - 1 }, { 15 16 17 18 - 1 }, { 19 20 21 - 1 }, { 22 23 24 25 - 1 }
 19  };
 20 
 21  struct  Trie {
 22       int  c;
 23      Trie  * next[ 26 ];
 24       Trie() {
 25          c  =   0 ;
 26          memset(next,  0 sizeof (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,  0 sizeof (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 

你可能感兴趣的:(pku1451 trie树)