Flying to the Mars HDU 1800(字典树)
转载请注明出处,谢谢。http://www.cnblogs.com/acmer-roney/---by Roney
题意:给你一串数字,代表士兵的等级,等级高的士兵可以教等级地的士兵,但要求每个士兵最多只能教一个士兵,且每个士兵最多是能有一个老师。抽象的说就是,将一串数尽可能少的分成几组满足每一组里的数字各不相同。
解题思路:理解题意了,解法就很明朗了。很容易想到的就是贪心,可是此题给出的数据多达30位,用long long或doube都无法存储,所以只能用字符串来存储。所以又可以想到用字典树!在插入字符串时只要统计最多有多少个相同的字符串就可以了。但是这里要注意一点,字符串有前导0!所以在插入时要把前导0去掉。(在此处WA了两次,唉,考虑不全面啊!这是我很大的毛病。)
AC 代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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) 编辑 收藏 举报