hdu 1075(hash)

//字符串hash练手题,采用拉链式解决冲突 

#include <cstdio>

#include <cstring>

#include <iostream>



using namespace std;



const int M = 43853;//hash表大小 



struct node {//节点 

    char str1[11];

    char str2[11];

    node *next; 

};



struct hashTable {//hash表 

    node *link;

}hash[M];



char text[3005];

char str1[11], str2[11], ch[11], ans[11];



void init() {//初始化 

    for (int i=0; i<M; ++i) hash[i].link = NULL;

    return ;

}



unsigned int BKDRHash(char * str) {//hash

    unsigned int seed = 131;

    unsigned int hash = 0;

    while (*str) hash = hash * seed + (*str++);

    return hash & 0x7FFFFFFF;

}



void insert(char *str1, char *str2) {//插入 

    int k = BKDRHash(str1) % M;

    node *p = new node();

    strcpy(p->str1, str1);

    strcpy(p->str2, str2);

    p->next = hash[k].link;

    hash[k].link = p;

    return ;

}



int find(char *str) { //查找 

    int k = BKDRHash(str) % M;

    node *p = hash[k].link;

    while (p) {

        if (!strcmp(p->str1, str)) {

            strcpy(ans, p->str2);

            return 1;  //找到 

        }

        p = p->next; 

    }

    return 0; // 没找到 

}



int main() {

    init();

    scanf ("%s", str1);

    while (scanf("%s", str1), strcmp(str1, "END")!=0) {

        scanf ("%s", str2);

        insert(str2, str1);

    }

    scanf ("%s", str1);

    getchar();

    while (gets(text), strcmp(text, "END")!=0) {

        int l = strlen(text);

        for (int i=0; i<l;) {

            int k = 0;

            if (text[i]>='a' && text[i]<='z') {

                int j = i;

                while (text[j]>='a' && text[j]<='z' && j<l) ch[k++] = text[j++];

                i = j;

                ch[k] = '\0';

                if (find(ch)) printf ("%s", ans);

                else printf ("%s", ch);

            }

            else printf ("%c", text[i++]);

        }

        puts("");

    }

    return 0;

}

 

你可能感兴趣的:(hash)