HDU1880 字符串 hash

无意中看到这题,就切了一下,感觉这题很适合刚刚接触散列表和字符串处理的朋友,直接对字符串 hash 就可以了,用 map 暴力不知道能不能过,没有尝试过。

我的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
#include <algorithm>
#include <cstdio>
#include <cstdlib>
#include <cstring>

using namespace std;

const int MAX = 210000;
const int mod = 100007;

struct Node {
Node* ne;
char st[81];
} hash[MAX], *h[mod], *cur;

unsigned int BKDHash(char* s) {
unsigned int seed = 131;
unsigned int ret = 0;
while (*s) {
ret = ret * seed + *s++;
}
return (ret & 0x7FFFFFFF) % mod;
}

int getId(char* s) {
int code = BKDHash(s);
Node* ptr = h[code];
while (ptr) {
if (strcmp(ptr->st, s) == 0) {
return ptr - hash;
} else {
ptr = ptr->ne;
}
}
strcpy(cur->st, s);
cur->ne = h[code];
h[code] = cur++;
return cur - hash - 1;
}

int find(char* s) {
int code = BKDHash(s);
Node* ptr = h[code];
while (ptr) {
if (strcmp(ptr->st, s) == 0) {
return ptr - hash;
} else {
ptr = ptr->ne;
}
}
return -1;
}

int main() {
char s[100], *p;
int id, n;
cur = hash;
memset(h, 0, sizeof(h));
while (scanf("%s", s), s[0] != '@') {
getId(s);
getchar();
gets(s);
getId(s);
}
scanf("%d", &n);
gets(s);
while (n--) {
gets(s);
id = find(s);
if (id == -1) {
puts("what?");
} else {
p = hash[id ^ 1].st;
if (p[0] != '[') {
puts(p);
} else {
p++;
while (*p != ']') {
putchar(*p++);
}
puts("");
}
}
}
return 0;
}