poj3283_trie树+hash

此题中给出一些扑克牌序列,这些序列的尾部如果相同的话,可以用一个节点表示,问如果存储所有这些扑克牌,一共所需多少节点。

分析:从每一个序列的尾部开始到首部,建立一个trie树,trie树的节点个数为ans。

此题还用了hash的思想,需要把扑克序列hash到int。看到别人有用map<string,int>hash的。感觉建立hash表有些麻烦啊。

代码:

View Code
  1 #include <iostream>
  2 #include <stdio.h>
  3 #include <stack>
  4 #include <string>
  5 using namespace std;
  6 
  7 const int n=53;
  8 struct node
  9 {
 10     node *next[n];
 11     node()
 12     {
 13         int i;
 14         for(i=0;i<n;i++)
 15             next[i]=NULL;
 16     }
 17 };
 18 node *root,*p;
 19 int res;
 20 
 21 int hash(string s)   //传说中的hash
 22 {
 23     int temp=0;
 24     if(s[1]=='0')
 25     {
 26         if(s[2]=='C') temp+=13*0;
 27         else if(s[2]=='D') temp+=13*1;
 28         else if(s[2]=='H') temp+=13*2;
 29         else temp+=13*3;
 30         return temp+=10;
 31     }
 32 
 33     if(s[1]=='C') temp+=13*0;
 34     else if(s[1]=='D') temp+=13*1;
 35     else if(s[1]=='H') temp+=13*2;
 36     else temp+=13*3;
 37 
 38     switch(s[0])
 39     {
 40         case 'A': temp+=1;break;
 41         case 'J': temp+=11;break;
 42         case 'Q': temp+=12;break;
 43         case 'K': temp+=13;break;
 44         default :temp+=s[0]-'0';break;
 45     }
 46     return temp;
 47 }
 48 
 49 void Insert(int num)
 50 {
 51     if(p->next[num]==NULL)
 52     {
 53         p->next[num]=new node();
 54         res++;
 55     }
 56     p=p->next[num];
 57 }
 58 
 59 void Delete(node *t)
 60 {
 61     int i;
 62     for(i=0;i<n;i++)
 63     {
 64         if(t->next[i]!=NULL)
 65             Delete(t->next[i]);
 66         t->next[i]=NULL;
 67     }
 68     delete t;
 69 }
 70 
 71 int main()
 72 {
 73     int num,m,i,j;
 74     string str;
 75     stack<string> s;
 76     while(scanf("%d",&num) && num!=0)
 77     {
 78         res=0;
 79         root=new node();
 80         for(i=0;i<num;i++)
 81         {
 82             scanf("%d",&m);
 83             for(j=0;j<m;j++)
 84             {
 85                 cin>>str;
 86                 s.push(str);
 87             }
 88 
 89             p=root;
 90             while(!s.empty())
 91             {
 92                 int value=hash(s.top());
 93                 s.pop();
 94                 Insert(value);
 95             }
 96         }
 97         printf("%d\n",res);
 98         Delete(root);
 99     }
100     return 0;
101 }

注意动态开辟数组后,要释放,否则造成内存泄漏。

此题也是tju oj2291.

posted @ 2012-07-22 10:11  pushing my way  阅读(569)  评论(0编辑  收藏  举报