您的位置:首页 > 其它

uva10282

2016-05-12 18:53 204 查看
题意:

某地语言与a君母语不同,现给出对应关系,求这个语言多对应的母语,没有则输出eh

思路:

用到了隐士图搜索,给每个某地语言分配标号

这里用到了一个非常高效的哈希函数:

maxn = 1000003

int Hash(char* str) {
int seed = 131;
unsigned int v = 0;
while(*str) {
v = v * seed + (*str++);
}
return (v & 0x7FFFFFFF) % maxn;
}
那么用链表把同标号的某地语言穿起来,这个查找是否与输入的相同即可
代码:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn = 100005;
char m[maxn][30], y[maxn][30];
char Model[maxn][60];
int head[maxn];
int Next[maxn];

int Hash(char* t) {
int seed = 131;
unsigned int s = 0;
while(*t) {
s = s*seed+(*t++);
}
return s&(0x7FFFFFFFF)%maxn;
}

void build(int n) {
int h = Hash(y
);
Next
= head[h];
head[h] = n;
}

void find(char *s) {
int h = Hash(s);
int u = head[h];
while(u) {
if(strcmp(s, y[u]) == 0) {
printf("%s\n", m[u]);
return;
}
u = Next[u];
}
printf("eh\n");
}

int main() {
int i = 1;//head[x] = 0为空头结点
while(gets(Model[i])) {
if(Model[i][0] == '\0') break;
sscanf(Model[i], "%s%s", m[i], y[i]);
build(i);
i++;
}
char tmp[30];
while(gets(tmp)) find(tmp);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: