HDU 1800 Hash

这道题简化一些就是求输入相等的字符串的最大值,即最多有多少字符串相等,用map做的话相当简单,但是会超时,可能是用cin的原因,这里将字符串Hash到一个整数,然后就很简单了,注意这里有些地方需要注意的,即字符串前导零的处理!!

View Code
 1 /*
2 * Author:lonelycatcher
3 * problem:hdu 1800
4 * Type:字符串的Hash
5 */
6 #include <iostream>
7 #include<limits.h>
8 #include<string.h>
9 #include<string>
10 #include<algorithm>
11 #include<stdio.h>
12 using namespace std;
13 int N;
14 int Hash[3010];
15 char str[40];
16 int BKDRHash(char* s)
17 {
18 long long seed=131;
19 long long hash=0;
20 while(*s=='0')s++;//这点很重要,因为0000345645和34564是一个数,但是如果不处理的话会对应到不同的Hash值
21 while(*s)
22 {
23 hash=hash*seed+(*s++);
24 }
25 return (hash & 0x7FFFFFFF);
26 }
27 int cmp(const void* a,const void* b)
28 {
29 return *(int*)b-*(int*)a;
30 }
31 int main()
32 {
33 setbuf(stdout,NULL);
34 int i,ans;
35 while(scanf("%d",&N)!=EOF)
36 {
37 i=0,ans=1;
38 for(i=0;i<N;i++)
39 {
40 scanf("%s",str);
41 Hash[i]=BKDRHash(str);
42 }
43 qsort(Hash,N,sizeof(Hash[0]),cmp);
44 /* for(i=0;i<N;i++)
45 {
46 printf("%d ",Hash[i]);
47 }*/
48 int temp=1;
49 for(i=1;i<N;i++)//ans即为 相等的数的最大值
50 {
51 if(Hash[i]==Hash[i-1])
52 {
53 temp++;
54 if(temp>ans)ans=temp;
55 }
56 else temp=1;
57 }
58 printf("%d\n",ans);
59 }
60 return 0;
61 }

posted on 2011-08-23 18:43  lonelycatcher  阅读(801)  评论(0编辑  收藏  举报

导航