POJ-2503 Babelfish Hash表
这题用hash表做有点无病呻吟了,因为用map更快更简单。
把字符串按每一位乘以相应的位置,再进行hash操作。
这题还做的时候还遇到一个问题,在进行字符串复制的时候,由于直接sizeof(in)由于in在这个函数里面覆盖了全局的in所以in是一个指针变量,所以并不是15而是4,每次只赋值4个字节,肯定是错了点。
代码如下:
#include <cstring> #include <cstdio> #include <cstdlib> #define MOD 2000003 using namespace std; char s[50], in[15], out[15]; int head[2000003], idx; struct Node { char w[15], t[15]; int next; }e[1000005]; void Hash(char *in, char *out) { int key = 0; int length = strlen(in); for (int i = 0; i < length; ++i) { key += in[i] * (i+1); } key %= MOD; ++idx; strcpy(e[idx].w, in); strcpy(e[idx].t, out); e[idx].next = head[key]; head[key] = idx; } int find(char *in) { int length = strlen(in), key = 0; for (int i = 0; i < length; ++i) { key += in[i] * (i+1); } key %= MOD; for (int i = head[key]; i != -1; i = e[i].next) { if (!strcmp(in, e[i].w)) { return i; } } return -1; } int main() { int ans; memset(head, 0xff, sizeof (head)); idx = -1; while (gets(s)) { int length = strlen(s); if (length != 0) { sscanf(s, "%s %s", out, in); Hash(in, out); } else { while (gets(s)) { ans = find(s); if (ans == -1) { puts("eh"); } else { printf("%s\n", e[ans].t); } } } } return 0; }