字符串哈希之ELFHash,poj2503
#include <iostream> #include<cstdio> #include<cstring> using namespace std; const int M = 149993; typedef struct { char e[11]; char f[11]; int next; }Entry; Entry entry[M]; int i = 1; int hashIndex[M];//哈希表 int ELFHash(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%M; } void find(char f[]) { int hash = ELFHash(f); for(int k = hashIndex[hash]; k; k = entry[k].next) { if(strcmp(f, entry[k].f) == 0) { printf("%s\n",entry[k].e); return; } } printf("eh\n"); } int main() { char str[22]; while(gets(str)) { if(str[0] == '\0') break; sscanf(str,"%s %s",entry[i].e,entry[i].f);//按格式给str赋值 int hash = ELFHash(entry[i].f); entry[i].next = hashIndex[hash]; hashIndex[hash] = i; i++; } while(gets(str)) find(str); return 0; }