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\n",ans);
}
return 0;
}
分析:只要求出重复出现次数最多的数字出现的次数就好了
你说,我们都会幸福的,对吧?