题目大意:给出英语 --- A国语言 ,然后输入A国语言单词,问在字典内是否有该单词,有就输出该单词英文,无则输出eh;
思路:典型的先保存再查找,有好几种解法,我用得是hash,但是再用链表的时候无限WA啊,也不知道是那个字符串哈希有问题还是链表出了问题,求强力数据找BUG啊
AC program:(数组哈希)
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
using namespace std;
char aa[15],bb[15];
char cc[15];
char w[24];
int num;
int head[100005];
struct node
{
char str1[15],str2[15];
int tto;
}next[100005];
int get_key(char tmp[])
{
unsigned int key=0;
unsigned int a=61891; //unsigned保证数据不爆
while(*tmp)
{
key=key*a+(*tmp++);
}
return key%99991;
}
void hash_insert(char aaa[],char bbb[])
{
int key=get_key(bbb);
next[num].tto=head[key];
strcpy(next[num].str1,aaa);
strcpy(next[num].str2,bbb);///
head[key]=num++;
}
void hash_find(char ccc[])
{
int key=get_key(ccc);
for(int i=head[key];i;i=next[i].tto)
{
if(strcmp(next[i].str2,ccc)==0)
{
printf("%s\n",next[i].str1);
return;
}
}
printf("eh\n");
}
int main()
{
num=1;///
memset(head,0,sizeof(head));
memset(next,0,sizeof(next));
while(gets(w) && w[0])
{
sscanf(w ,"%s%s",aa,bb);
hash_insert(aa,bb);
}
while(scanf("%s",cc)!=EOF)
{
hash_find(cc);
}
//system("pause");
return 0;}
WA program:(链表哈希,呜呜,各种WA,求数据啊)
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<math.h>
using namespace std;
#define HashTableSize 99991
char aa[20],bb[20];
char cc[20];
char w[40];
typedef class HashTable
{
public :
char str1[20],str2[20];
HashTable *next;
HashTable()
{
next=0;
memset(str1,0,sizeof(str1));
memset(str2,0,sizeof(str2));///
}
}Hashtable;
Hashtable * hash[100005];
/*unsigned int ELFHash (const char *str)
{
unsigned int key=0;
unsigned int x=0;
while(*str)
{
key=(key<<4)+(*str++);
if((x=key&0xF0000000L)!=0)
{
key^=(x>>24);
key&=~x;
}
}
return key;//key&0x7fffffff;
}*/
int ELFHash(char * key)
{
unsigned int h = 0;
while (*key){
h = (h << 4) + *key++;
unsigned int g = h & 0xf0000000L;
if (g) h ^= g >> 24;
h &= ~g;
}
return h;//h % 99991;
}
void hash_insert(char aaa[],char bbb[])
{
int key=ELFHash(bbb)%HashTableSize;
if(!hash[key])
{
Hashtable *temp =new Hashtable ;
//temp->str1=aaa;
strcpy(temp->str1,aaa);
strcpy(temp->str2,bbb);
hash[key]=temp;
}
else
{
Hashtable *temp=hash[key];
while(temp->next)
temp=temp->next;
temp->next=new HashTable;
strcpy(temp->str1,aaa);
strcpy(temp->str2,bbb);
}
}
bool hash_find(char ccc[])
{
int key=ELFHash(ccc)%HashTableSize;
if(!hash[key])
return false;
else
{
Hashtable *temp=hash[key];
while(temp)
{
if(strcmp(temp->str2,ccc)==0)
{
printf("%s\n",temp->str1);
return true;
}
temp=temp->next;
}
}
return false;
}
int main()
{
memset(hash,0,sizeof(hash));
/*while(1)
{
if((aa[0]=getchar())=='\n')break;
scanf("%s%s",aa+1,bb);
insert(aa,bb);
//getchar();
}*/
while(gets(w) && w[0]!=0)
{
sscanf(w,"%s %s",aa,bb);
hash_insert(aa,bb);//add(a,b);
}
while(scanf("%s",cc)!=EOF)///
{
if(!hash_find(cc))
printf("eh\n");
}
return 0;}