題目鏈接:http://poj.org/problem?id=2503
#include <cstdio>
#include <cstring>
#define MAXSIZE 150000
//#define maxn 30
#define kind 20
const int MOD = 131101; //一個大質數
struct HASH
{
char pre[kind], now[kind];
HASH *next;
HASH() {
next = NULL;
}
} head[MAXSIZE], New[MAXSIZE];
int nn = 0;
//int ELFhash(const 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%MOD;
//}
int RKHash(char *str)
{
unsigned long hash = 0;
while (*str) {
hash = (hash * 26) + (*str - 'a');
str++;
}
return (hash % MOD);
}
void Find(char a[])
{
int key = RKHash(a);
//int key = ELFhash(a);
HASH *p = head[key].next;
bool flag = false;
while (p) {
if (strcmp(p->now, a) == 0) {
flag = true;
printf("%s\n", p->pre);
break;
}
p = p->next;
}
if (!flag) printf("eh\n"); //找不到
}
void Insert(char a[], char b[])
{
//int key = ELFhash(b);
int key = RKHash(b);
HASH *p = &New[nn++];
strcpy(p->now, b);
strcpy(p->pre, a);
p->next = NULL;
p->next = head[key].next;
head[key].next = p;
//delete p;
}
void init()
{
nn = 0;
for (int i = 0; i < MAXSIZE; i++) {
head[i].next = NULL;
}
}
int main()
{
//init();
char a[22], b[11], c[11];
while(gets(a), a[0]) {
sscanf(a, "%s%s", b, c);
Insert(b, c);
}
while(~scanf("%s", a)) {
Find(a);
}
return 0;
}