-
Notifications
You must be signed in to change notification settings - Fork 2
/
36_Hash.cpp
122 lines (99 loc) ยท 2.42 KB
/
36_Hash.cpp
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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
#include <iostream>
#include <vector>
#include <algorithm>
#include <string.h> // memset
#define HASH_SIZE (1<<18)
#define MAXN 100000
#define DIV (HASH_SIZE - 1)
using namespace std;
typedef unsigned long long ll;
// ๋ฌธ์์ด ๋น๊ต
bool strCmp(char a[],char b[]){
int i = 0;
for(;a[i];i++){
if(a[i] != b[i]){
return false;
}
}
return a[i] == b[i];
}
// ๋ฌธ์์ด ๋ณต์ฌ
void strCpy(char dst[],char src[]){
while(*src){
*dst++ = *src++;
}
*dst = 0;
}
// ๊ตฌ์กฐ์ฒด
struct Node{
char key[11];
int data;
Node *next;
// ํ ๋นํ๊ธฐ
Node *alloc(char _key[],int _data,Node *_next){
strCpy(key,_key); // key๋ฅผ ๋ณต์ฌํด์ ๋ฃ๋๋ค.
data = _data; // ๋ฐ์ดํฐ๋ ๋ณต์ฌ
next = _next; // next ๋ ๋ณต์ฌ
return this;
}
// ์ฐพ๋ node์ ๋ฐ๋ก ์ด์ node๋ฅผ ๋ฐํํ๋ค.
Node *getPrevNode(char _key[]){
Node *ptr = this;
while(ptr->next){
// ์ฐพ๋ ํค๊ฐ ๋ค์ ๋
ธ๋์ ํค์ ๊ฐ๋ค๋ฉด ๋ฉ์ถค!
if(strCmp(_key,ptr->next->key)){
break;
}
ptr = ptr->next;
}
return ptr;
}
};
int bCnt;
Node buf[MAXN];
Node hashTable[HASH_SIZE];
void init(){
bCnt = 0;
for(int i=0;i<HASH_SIZE;i++){
hashTable[i].next = 0;
}
}
// ํด์ฌ ๊ฐ ๋ฐํ.
int getKey(char str[]){
ll key = 5381;
for(int i=0;str[i];i++){
key = ((key<<5)+key)+(str[i]-'a'+1);
}
return (int)(key & DIV);
}
// ํค๋ฅผ ํตํด ์ฐพ๊ธฐ
int find(char key[]){
Node *prevNode;
int target = getKey(key); // ํค๊ฐ์ ํตํด ํด์ ๊ฐ์ ๋ฐ์์์
prevNode = hashTable[target].getPrevNode(key); // ํด์๊ฐ์ผ๋ก ์ฐพ๊ธฐ
return prevNode->next->data;
}
// ์ถ๊ฐํ๊ธฐ
void add(char key[],int data){
int target = getKey(key); // ํค ๊ฐ์ ํตํด ํด์ ๊ฐ์ ๋ฐ์์์
hashTable[target].next = buf[bCnt++].alloc(key,data,hashTable[target].next);
}
// ์ญ์ ํ๊ธฐ
int remove(char key[]){
Node *prevNode, *targetNode;
int target = getKey(key);
prevNode = hashTable[target].getPrevNode(key);
targetNode = prevNode->next;
prevNode->next = targetNode->next;
return targetNode->data;
}
int main(void){
// ์
์ถ๋ ฅ ์๋ ์ต์ ํ
ios::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
int T; cin>>T;
for(int tc=1;tc<=T;tc++){
cout<<"#"<<tc<<' ';
}
return 0;
}