UVa 10282 & POJ 2503 - Babelfish

本文介绍了一种使用BKDHash哈希函数解决UVa10282&POJ2503问题的方法。通过将单词映射到哈希表中,实现快速查找对应英文单词的功能。文章详细解释了如何建立单词与位置的关系,并提供了完整的代码示例。

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

传送门UVa 10282 & POJ 2503 - Babelfish


题意大家肯定都读得懂。

一开始我抱着侥幸的心里,没判重,直接映射了哈希值。。然后UVa就给了我一发WA。


这题的关键是建立单词(oodog)和单词所在二维数组(dic[l])的位置的关系。

和前几题一样,我选择了BKDHash作为哈希函数。其实我觉得从隐式图遍历专题开始就应该归为哈希表的应用。。


在第一阶段,也就是字典的输入阶段,把英文和单词按顺序储存起来,并把位置映射到哈希表上,如果有重复的哈希值,管自己插即可XD。


第二阶段,即查找阶段,把每个单词也映射成哈希表,如果表上有元素存在,就是那个单词。这时候有可能一个元素有多个值,就按照链表比较下来。如果有的话,就返回位置,没有,就是没有了。。。


详情见代码


#include <cstdio>
#include <cstring>
using namespace std;
const int HashSize = 200000;

char eng[110000][30], dic[110000][30];
int head[HashSize], next[HashSize];
int BKDHash(char *c);
int Search(char *s);
void Insert(int s);

int main()
{
	//freopen("input.txt", "r", stdin);
	int next, i, j, k, l = 1;
	bool stopFlag;
	char str[20], temp[50];
	while (fgets(temp, 50, stdin))
	{
		if (temp[0] == '\n')
			break;
		k = 0;
		for (i = 0; temp[i] != ' '; i++)
			eng[l][i] = temp[i];
		eng[l][i] = 0;
		for (++i; temp[i] != '\n'; i++)
			dic[l][k++] = temp[i];
		dic[l][k] = 0;
		Insert(l);
		l++;
	}
	while (~scanf("%s", str))
	{
		int num = Search(str);
		if (num == 0)
			puts("eh");
		else
			puts(eng[num]);
	}
	return 0;
}

int BKDHash(char *c)	//哈希函数。
{
	int seed = 131;
	int Hash = 0;
	for (int i = 0; i < strlen(c); i++)
		Hash = Hash * seed + c[i];
	return (Hash & 0x7FFFFFFF) % HashSize;
}

void Insert(int s)
{
	int v = BKDHash(dic[s]);
	next[s] = head[v];	//插入到当前值的首部
	head[v] = s;
}

int Search(char *s)
{
	int v = BKDHash(s);
	int u = head[v];
	while (u)
	{
		if (strcmp(s, dic[u]) == 0)
			return u;
		u = next[u];
	}
	return 0;
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值