UVa 188 - Perfect Hash

題目:有n個單詞,按照32進制轉化為數字w[0..n-1],需要求一個計算hash函數的數字C,

            hash函數為h[i] = C/w[i]%n,計算C的規則已知,將w遞增排序,取h[0] = w[0]),

            如果每個h[i]均不相同,則h[0]即为所求,否則h[i] == h[j]時,C 為: 

           

            迭代計算直到滿足每個h均不相同。

分析:數論、模擬。數據較小,直接模擬即可。

說明:╮(╯▽╰)╭。

#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>

using namespace std;

char buf[1024];
int  w[100];

int main()
{
	while (gets(buf)) {
		int n = 0, now_value = 0;
		for (int i = 0; buf[i]; ++ i) {
			if (buf[i] < 'a' || buf[i] > 'z') {
				if (0 != now_value) {
					w[n ++] = now_value;
					now_value = 0;
				}
			}else {
				now_value = (now_value<<5)+(buf[i]-'a'+1);
			}
		}
		if (0 != now_value) {
			w[n ++] = now_value;
		}
		
		sort(w, w+n);
		
		int flag = true, C = w[0];
		while (flag) {
			flag = false;
			for (int i = 0; i < n; ++ i) {
				for (int j = i+1; j < n; ++ j) {
					if (C/w[i]%n == C/w[j]%n) {
						C = min((C/w[i]+1)*w[i], (C/w[j]+1)*w[j]);
						flag = true;
					}
				}
			}
		}
		
		printf("%s\n%d\n\n",buf,C);
	} 
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值