hdu1800(简单字符串哈希)

题意:一堆士兵学骑扫把,高级士兵可以教低级士兵,并且共用一个扫把,一个老师只能有一个学生,这个关系可以传递的,例如等级A>B>C>D>F>E,则A可以教B、B可以教C、...,那么ABCDEF共用一个扫把.
给出所有士兵的等级,求最少要多少个扫把。

解题思路:可以看得出扫把的数量就是某个最多人的等级中的人数,那么就是简单的hash了,对应的关系是
hash【等级】 = 人数
求最大人数

不想搞hash的,感觉用map会更快

283msG++代码

#include <cstdlib>
#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
const int MAXN = 7003;
int Hash[MAXN];
int Count[MAXN];
inline int ELFHash(char *key)
{
unsigned long h = 0;
unsigned long g;
while( *key )
{
h =( h<< 4) + *key++;
g = h & 0xf0000000L;
if( g ) h ^= g >> 24;
h &= ~g;
}
return h;
}
int maxc,n;
inline void hashit(char *str)
{
while( '0' == *str ) str++;
int key = ELFHash(str);
int cc = key % MAXN;            //求出哈希值
while( Hash[cc] != key && Hash[cc] != -1) //如果发现冲突,处理冲突
cc = (cc + 10) % MAXN;
if( Hash[cc] == -1 )//没存在
{
Count[cc] = 1;
Hash[cc] = key;
}
else
{
Count[cc]++;
if(Count[cc] > maxc )
maxc = Count[cc];
}
}
int main()
{
char str[100];
while(scanf("%d",&n) != EOF)
{
maxc = 1;
memset(Hash,-1,sizeof(Hash));
for(int i=0; i<n; i++)
{
scanf("%s",str);
hashit(str);
}
printf("%d\n",maxc);
}
return 0;
}

 

你可能感兴趣的:(字符串,include)