Flying to the Mars HDU 1800(字典树)

 转载请注明出处,谢谢。http://www.cnblogs.com/acmer-roney/---by Roney

题意:给你一串数字,代表士兵的等级,等级高的士兵可以教等级地的士兵,但要求每个士兵最多只能教一个士兵,且每个士兵最多是能有一个老师。抽象的说就是,将一串数尽可能少的分成几组满足每一组里的数字各不相同。

 

解题思路:理解题意了,解法就很明朗了。很容易想到的就是贪心,可是此题给出的数据多达30位,用long long或doube都无法存储,所以只能用字符串来存储。所以又可以想到用字典树!在插入字符串时只要统计最多有多少个相同的字符串就可以了。但是这里要注意一点,字符串有前导0!所以在插入时要把前导0去掉。(在此处WA了两次,唉,考虑不全面啊!这是我很大的毛病。)

 

AC 代码:

View Code
 1 #include<cstdio>
 2 #include<iostream>
 3 using namespace std;
 4 const int kind=10;
 5 struct TrieNode{
 6     bool isColored;
 7     int count;
 8     TrieNode *next[kind];
 9 }Memory[10000000];
10 int n,allcop,ans;
11 TrieNode *Root;
12 TrieNode *CreateTrieNode(){
13     TrieNode *p=&Memory[allcop++];
14     p->isColored=false;p->count=0;
15     for(int i=0;i<kind;i++)
16         p->next[i]=NULL;
17     return p;
18 }
19 void Insert(char *s){
20     TrieNode *p=Root;
21     if(!p)p=Root=CreateTrieNode();
22     int i=0,branch;
23     while(s[i]=='0')i++;//此处一定要注意去掉前导0!
24     while(s[i]){
25         branch=s[i++]-'0';
26         if(!(p->next[branch])) p->next[branch]=CreateTrieNode();
27         p=p->next[branch];
28     }
29     if(p->isColored){
30         if(ans<(p->count+1))ans=p->count+1;
31     }
32     else p->isColored=true;
33     p->count++;
34 }
35 int main()
36 {
37     //freopen("in.txt","r",stdin);
38     char s[31];
39     while(scanf("%d",&n)!=EOF){
40         getchar();
41         Root=NULL;
42         allcop=0;ans=1;
43         for(int i=1;i<=n;i++){
44             gets(s);
45             Insert(s);
46         }
47         printf("%d\n",ans);
48     }
49     return 0;
50 }

 

posted on 2012-09-12 08:41  Acmer_Roney  阅读(196)  评论(0编辑  收藏  举报

导航