HDU1800 字典树写法

 题意:高级魔法师可以教低级魔法师 魔法扫把技能,同时教会了的低级魔法师又可以教比他更低级是,是传递的关系

 同时如果教会了的话,他们可以同时坐一个扫把 问最少需要多少个扫把

思路:就是判断相同的数字最多的是几个 他们分别乘坐一个扫把,这样其他的也能合理分配进这几个扫把

坑:这里刚开始数组开得过大总超时,超时到怀疑人生,后面开小直接过了。。。

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int maxn=3000+5;
 4 struct Trie{
 5     int ch[maxn][12];
 6     int size;
 7     int num[maxn];
 8     void init(){
 9         memset(ch,0,sizeof(ch));
10         memset(num,0,sizeof(num));
11         size=1;
12     }
13     int insert(char*s){
14         int i=0,rc=0;
15         while(s[i]=='0')i++;
16         for( ;s[i]!='\0';i++){
17             int id=s[i]-'0';
18             if(ch[rc][id]==0){
19                 ch[rc][id]=size++;
20             }
21             rc=ch[rc][id];
22         }
23         num[rc]++;
24         return num[rc];
25     }
26 
27 }trie;
28 char temp[300];
29 int main(){
30     int n;
31     while(scanf("%d",&n)==1){
32         int ans=0;
33     //    getchar();
34         trie.init();
35         while(n--){
36             scanf("%s",temp);
37             ans=max(trie.insert(temp),ans);
38         }
39         printf("%d\n",max(1,ans));
40     //    cout<<max(1,ans)<<endl;
41     }
42     return 0;
43 }

 

posted @ 2019-01-10 21:53  tttttttttrx  阅读(195)  评论(0编辑  收藏  举报