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 }