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.