题目大意:士兵要学骑扫帚。每个士兵有一个level,level高的能在同一把扫帚上教level低的怎么骑。一个人最多有一个老师,一个学生。也可以没有。给n个士兵的level值,问最少需要多少扫帚。
//字典树 #include #include int cnt,n,max; char s[50]; struct Node{int son[10];int sum;}trie[500000]; void insert(char *s){ for(int l=strlen(s),i=0,x=0;i<l;i++){ if(!trie[x].son[s[i]-'0'])trie[x].son[s[i]-'0']=++cnt; x=trie[x].son[s[i]-'0']; if(i==l-1){ trie[x].sum++; if(trie[x].sum>max)max=trie[x].sum; } } } void del(int x){ for(int i=0;i<10;i++) if(trie[x].son[i]){ del(trie[x].son[i]); trie[x].son[i]=0; } trie[x].sum=0; } int main(){ while(~scanf("%d",&n)){ gets(s); max=-1; cnt=0; for(int i=0;i<n;i++){ gets(s); int j; for(j=0;j<strlen(s);j++) if(s[j]!='0') break; if(j==strlen(s))insert("0"); else insert(s+j); } printf("%d ",max); del(0); } return 0; } //STL #include <map> #include <cstdio> using namespace std; int main() { int n; while(scanf("%d",&n)!=EOF) { int i,max=-1,m; map<int,int>A; for(i=0;i<n;i++) { scanf("%d",&m); A[m]++; if(max<A[m]) max=A[m]; } printf("%d ",max); } return 0; }