题意:
给定一个英文单词和另外一种语言单词的对照表,然后再每次给定一个另一种语言的单词,询问是否有对应的英文单词与其对应,如果有的话输出那个英文单词,否则输出“eh”.
思路:
这道题以前用map做了一次,这次用的是BDK字符串哈希做的,值得注意的是hash表应该尽量取大一点,否则效率
会很低。
代码如下:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int a[1001000];
char ch[1001000][15];
char ans[1001000][15];
int BKDhash(char *str)
{
int seed=31;
long long sum=0;
while(*str)
{
sum+=sum*seed+(*str++);
}
sum=(sum&0x7fffffff);
return sum%1000007;
}
int Insert(char *str,char *str1)
{
int h=BKDhash(str);
while(a[h]!=0)
h++;
a[h]=1;
strcpy(ch[h],str);
strcpy(ans[h],str1);
}
int find(char *str)
{
int h=BKDhash(str);
if(a[h]==0)
return 0;
while(a[h]!=0)
{
if(strcmp(ch[h],str)==0)
{
printf("%s\n",ans[h]);
return 1;
}
h++;
}
return 0;
}
int main()
{
int i;
memset(a,0,sizeof(a));
char str[10000],str1[100],str2[100];
while(gets(str))
{
if(strlen(str)==0)
break;
sscanf(str,"%s %s",str1,str2);
Insert(str2,str1);
}
while(scanf("%s",str)!=EOF)
{
if(find(str)==0)
printf("eh\n");
}
return 0;
}