-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathHashTableTest.java
More file actions
60 lines (53 loc) Β· 1.93 KB
/
Copy pathHashTableTest.java
File metadata and controls
60 lines (53 loc) Β· 1.93 KB
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
package basic.b;
import java.io.BufferedReader;
import java.io.InputStreamReader;
/**
* https://codeforces.com/contest/4/problem/C
* */
public class HashTableTest {
// λ³΄ν΅ 100,000 μΌλ, 1000 * {100*4} λ‘ μ€μ νλ€.
private static final int HASH_SIZE = 1000;
private static final int HASH_LEN = 400;
private static final int HASH_VAL = 257; // 19, 21 κ°μ λλμ΄ λ¨μ΄μ§μ§ μλ μλ‘ λλμ΄μ€λ€. (ν° μμκ° μ’λ€.)
private static String[][] hash = new String[HASH_SIZE][HASH_LEN];
// μ€λ³΅λλ λ°μ΄ν°λ₯Ό λ£κΈ° μ«μλ, νμμ©μΌλ‘ μΈ λ§ν κ² κ°λ€.
private static int[][] idx = new int[HASH_SIZE][HASH_LEN];
// hash key κ°μ΄ μΆ©λλ¬μ λ, ν΄λΉ ν€κ°μ ν΄λΉνλ valueλ₯Ό μ°Ύμλ νμ©νλ€.
private static int[] cnt = new int[HASH_SIZE];
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine().trim()); // 1 <= N <= 10^5
StringBuilder sb = new StringBuilder();
for (int i = 0; i < N; i++) {
String str = br.readLine();
int key = getHashKey(str); // hash keyλ₯Ό μ΄μ©ν΄μ key κ°μ μ»μ΄μ¨λ€.
boolean flag = false;
int tmp = 0;
for (int j = 0; j < cnt[key]; j++) {
if (hash[key][j].equals(str)) {
flag = true;
break;
}
tmp++; // κ°μ΄ λ€μ΄μ¨ μμκ° λ³΄μ₯λκΈ° λλ¬Έμ ν΄λΉ tmpλ‘ ν΄μ¬μμ κ°μ μ°Ύλλ€.
}
if (!flag) { // κ°μ΄ μΆ©λλμ§ μλ κ²½μ°
hash[key][cnt[key]++] = str;
sb.append("OK").append("\n");
} else { // κ°μ΄ μΆ©λλλ κ²½μ°
idx[key][tmp] += 1;
sb.append(str).append(idx[key][tmp]).append("\n");
}
}
System.out.println(sb.toString());
}
private static int getHashKey(String str) {
int key = 0; // μ΄κΈ° key κ°
for (int i = 0; i < str.length(); i++) {
key = key * HASH_VAL + str.charAt(i); // + HASH_VALμ ν΄μ€λ λμ§λ§ ν¬κ² μλ―Έμλ€.
}
if (key < 0) { // stack overflowκ° λλ κ²½μ°
key = -key;
}
return key % HASH_SIZE; // ν΄λΉ μ¬μ΄μ¦μ λλ¨Έμ§μ μ μ₯νλ€.
}
}