TTTTTTTTTTTTTTTTTT hdu 1800 字符串哈希 裸题

题意:意思是有若干个飞行员,需要在扫帚上练习飞行,每个飞行员具有不同的等级,且等级高的飞行员可以当等级低的飞行员的老师,且每个飞行员至多有且只有一个老师和学生。具有老师和学生关系的飞行员可以在同一把扫帚上练习,并且这个性质具有传递性。即比如有A,B,C,D,E五个飞行员,且等级是A>B>C>D>E,那么可以使A当B的老师,B当C的老师,E当D的老师,那么A,B,C可以在同一扫帚上练习,D,E在同一把扫帚上练习,这样需要2把扫帚,而如果是A当B的老师,B当C的老师,C当D的老师,D当E的老师,那么只需要一把扫帚。题目所求即所需最少的扫帚数目。


#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <algorithm>
#include <set>
using namespace std;
typedef long long ll;
typedef unsigned long long Ull;
#define MM(a,b) memset(a,b,sizeof(a));
const double eps = 1e-10;
const int  inf =0x7f7f7f7f;
const double pi=acos(-1);
const int maxn=100+1000;
char s[150];
int Hash[4000];
int BKDRHash(char* s)
{
     long long seed=131;
     long long hashv=0;
     while(*s=='0')s++;
     while(*s)
     {
         hashv=hashv*seed+(*s++);
     }
     return (hashv & 0x7FFFFFFF);
}

int main()
{
    int n;
    while(~scanf("%d",&n))
    {
        for(int i=1;i<=n;i++)
             {
                 scanf("%s",s);
                 Hash[i]=BKDRHash(s);
             }
        sort(Hash+1,Hash+n+1);
        int ans=1,tmp=1;
        for(int i=2;i<=n;i++)
        {
            if(Hash[i]==Hash[i-1]) tmp++;
            else tmp=1;
            ans=max(ans,tmp);
        }
        printf("%d
",ans);
    }
    return 0;
}

  分析:只要求出重复出现次数最多的数字出现的次数就好了

原文地址:https://www.cnblogs.com/smilesundream/p/5494032.html