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;
}
posted @ 2012-07-12 12:00  沐阳  阅读(297)  评论(0编辑  收藏  举报