Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

字符串多项式法开放寻址hash

Posted by zhouzp15 at 2017-01-20 11:42:24 on Problem 2503
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
using namespace std;

const int MOD = 1000007;
const int M = 10 + 5;
const int PRIME = 37;
struct Entry { char key[M], value[M]; } ht[MOD];

int hash(const char *str)
{
	int idx = 0;
	for (int i = 0, len = strlen(str); i < len; i++) idx = idx * PRIME + str[i] - 'a';
	return abs(idx) % MOD;
}

bool check(const char *str1, const char *str2)
{
	int len1 = strlen(str1), len2 = strlen(str2);
	if (len1 != len2) return false;
	for (int i = 0; i < len1; i++) if (str1[i] != str2[i]) return false;
	return true;
}

void insert(const char *key, const char *value)
{
	int idx = hash(key);
	while (ht[idx].key[0] != '\0') idx = (idx + 1) % MOD;
	strcpy(ht[idx].key, key); strcpy(ht[idx].value, value);
}

void get(const char *key, char *value)
{
	int idx = hash(key);
	while (ht[idx].key[0] != '\0')
	{
		if ( check(key, ht[idx].key) ) { strcpy(value, ht[idx].value); return; }
		idx = (idx + 1) % MOD;
	}
	strcpy(value, "eh");
}

int main()
{
	char key[M], value[M], tmp[2 * M];
	while (gets(tmp) && strlen(tmp))
	{
		int pos = 0, i;
		for (i = 0; tmp[pos] != ' '; pos++, i++) value[i] = tmp[pos]; value[i] = '\0'; pos++;
		for (i = 0; tmp[pos] != '\0'; pos++, i++) key[i] = tmp[pos]; key[i] = '\0';
		insert(key, value);
	}
	while (gets(key)) get(key, value), printf("%s\n", value);
	return 0;
}

Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator