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.

你可能感兴趣的:(hash)