poj2503 哈希表

本文介绍如何使用ELFHash表与开放散列法实现两种语言间的单词查询转换。通过构造散列表来存储单词及其对应语言形式,并实现快速查找功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

 

 如题: http://poj.org/problem?id=2503

  一行输入2个字符串,第一个是一种语言表示,第二个是另一种语言表示,但他们的意思相同,只是表达不同。建完字典后,输入第2种语言的单词,输出第一种语言的表示方法。如果没有这个单词,输出eh

 

   用ELFhash表做,使用开放散列。

 

  ELFhash表具体解释,见我上一篇。

 

 

#include<iostream>
#include<cstring>

//#define MOD 0x7fffffff
#define M 100003

int ELFHash(char * key)
{
 unsigned long h=0;
 while(*key)
 {
  h=(h<<4)+*key++;
  unsigned long g=h&0xf0000000L;
  if(g)
  {
   h^=(g>>24);
   h&=~g;
  }
 }
 return h%M;
}

struct node
{
 int hash;
 struct node * next;
}* Link[M]={NULL};

char word[M][11];
char dialect[M][11];

int main()
{
 int i,e,n=0;
 char str[50];
 struct node * p;
 gets(str);
 while(strcmp(str,"")!=0)
 {
  for(i=0;str[i]!=' ';i++)
  {
   word[n][i]=str[i];
  }
  word[n][i++]='\0';
  strcpy(dialect[n],str+i);
  e=ELFHash(dialect[n]);
  p=new node();
  p->hash=n;
  p->next=Link[e];
  Link[e]=p; //防止冲突
  n++;
  gets(str);
 }
 while(gets(str)!=NULL)
 {
  e=ELFHash(str);
  p=Link[e];
  while(p!=NULL)
  {
   if(strcmp(str,dialect[p->hash])==0)
   {
    break;
   }
   p=p->next;
  }
  if(p==NULL)
   printf("eh\n");
  else
   printf("%s\n",word[p->hash]);
 }
 return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值