HDU 1800 Flying to the Mars

题目大意:士兵要学骑扫帚。每个士兵有一个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\n",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\n",max);  

    }  

    return 0;  

}  

 

你可能感兴趣的:(HDU)