Untitled
unknown
plain_text
2 years ago
1.6 kB
3
Indexable
#include <stdio.h> #include <string.h> #include <memory.h> #define MAX_KEY 64 #define MAX_DATA 128 #define MAX_TABLE 4096 typedef struct { char key[MAX_KEY + 1]; char data[MAX_DATA + 1]; }Hash; Hash tb[MAX_TABLE]; unsigned long hash(const char *str) { unsigned long hash = 5381; int c; while (c = *str++) { hash = (((hash << 5) + hash) + c) % MAX_TABLE; } return hash % MAX_TABLE; } int find(const char *key, char *data) { unsigned long h = hash(key); int cnt = MAX_TABLE; while (tb[h].key[0] != 0 && cnt--) { if (strcmp(tb[h].key, key) == 0) { strcpy(data, tb[h].data); return 1; } h = (h + 1) % MAX_TABLE; } return 0; } int add(const char *key, char *data) { unsigned long h = hash(key); while (tb[h].key[0] != 0) { if (strcmp(tb[h].key, key) == 0) { return 0; } h = (h + 1) % MAX_TABLE; } strcpy(tb[h].key, key); strcpy(tb[h].data, data); return 1; } int main(int argc, char* argv[]) { int T, N, Q; scanf("%d", &T); for (int test_case = 1; test_case <= T; test_case++) { memset(tb, 0, sizeof(tb)); scanf("%d", &N); char k[MAX_KEY + 1]; char d[MAX_DATA + 1]; for (int i = 0; i < N; i++) { scanf("%s %s\n", &k, &d); add(k, d); } printf("#%d\n", test_case); scanf("%d", &Q); for (int i = 0; i < Q; i++) { char k[MAX_KEY + 1]; char d[MAX_DATA + 1]; scanf("%s\n", &k); if (find(k, d)) { printf("%s\n", d); } else { printf("not find\n"); } } } return 0; }
Editor is loading...