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.

转载于:https://www.cnblogs.com/pushing-my-way/archive/2012/07/22/2603473.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值