트라이 구조는 문자열을 처리하는 알고리즘으로, 여러 문자열을 트리 구조를 활용하여 빠르게 처리하는 자료 구조이다.
맵을 사용한 구현
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
struct Node {
map< char, Node* > nxt;
bool end;
Node() {
nxt.clear();
end = false;
}
void insert(char *val) {
if(*val == '\0') end = true;
else {
if(!nxt[*val]) nxt[*val] = new Node();
nxt[*val]->insert(val+1);
}
}
};
|
cs |
포인터를 사용한 구현
기준 문제 : https://www.acmicpc.net/problem/5052
5052번: 전화번호 목록
첫째 줄에 테스트 케이스의 개수 t가 주어진다. (1 ≤ t ≤ 50) 각 테스트 케이스의 첫째 줄에는 전화번호의 수 n이 주어진다. (1 ≤ n ≤ 10000) 다음 n개의 줄에는 목록에 포함되어 있는 전화번호가
www.acmicpc.net
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
|
#include <stdio.h>
#include <algorithm>
#define NMAX 15
using namespace std;
struct Node {
Node *child[NMAX];
bool end, isChild;
Node() {
fill(child, child+NMAX, nullptr);
end = isChild = false;
}
~Node() {
for(int i=0;i<NMAX;i++) delete child[i];
}
// 노드 추가 및 일관성 확인
// 일관성이 있다: 모든 노드가 말단 노드에서 끝난다.
// >> (end == true) and (isChild == false)
bool insert(char* val) {
if(*val == '\0') {
end = true;
// 자식의 유무로 일관성 판별 가능
return !isChild;
}
else {
int nxt = *val - '0';
if(!child[nxt]) child[nxt] = new Node();
isChild = true;
// 일관성 판별하기
return (!end and child[nxt]->insert(val+1));
}
}
};
int T, N;
char tel[NMAX];
int main() {
scanf("%d", &T);
while(T--) {
scanf("%d", &N);
bool ret = true;
Node *root = new Node();
for(int i=1;i<=N;i++) {
scanf("%s", tel);
ret = (ret & root->insert(tel));
}
printf(ret ? "YES\n":"NO\n");
delete root;
}
}
|
cs |
'Study' 카테고리의 다른 글
가우스 소거법 (1) | 2023.10.31 |
---|---|
느리게 갱신되는 세그먼트 트리 (1) | 2023.10.09 |
FFT (0) | 2023.03.26 |
이분 매칭(소스코드) (0) | 2023.03.09 |
KMP 알고리즘 (0) | 2022.08.13 |