티스토리 뷰

 

트라이 기본 문제다.

트라이 짜는법을 마지막으로 정적으로 배웠기 때문에 정적트라이를 이용했다!

 

문제를 푸는 방법은 간단하다

트라이를 만들고 cnt배열을 만들어서 지나가는 정점마다 cnt를 올려주면 된다

그럼 내가 어떤 지점에서 시작한다고 할 때 그 수만큼 cnt가 올라갈 것 이다

 

근데 문제는 초기화가..! 문제였다

정적으로 잡기 때문에 노드의 수를 미리 max로 두고 시작한다

여기서는 100000개의 쿼리 X 10자리수 X 알파벳 26개 다

 

근데 바보같이 초기화 하는 부분에서 max 크기만큼 모든배열을 계속 초기화했다

시간초과가 정확히 30번 났다

 

혹시 오타가 났나 계속 다시 짰는데 문제는 초기화였다

생각해보면 초기화는 내가 사용한 정점까지만 해주면 된다

trie_cnt에 저장해놨기 때문에 딱 이만큼만 해주면 시간안에 너어어무 여유롭게 들어온다!

 

소스코드

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
#include <stdio.h>
#include <iostream>
using namespace std;
 
const int N = 100010 * 12;
const int M = 27;
 
int trie[N+1][M+1];
int cnt[N + 1];
int trie_cnt = 1;
 
void init(void) {
    for (int i = 0; i < trie_cnt; i++) {
        cnt[i] = 0;
        for (int j = 0; j < M; j++) {
            trie[i][j] = 0;
        }
    }
    trie_cnt = 1;
}
 
void insert(int buffer_size, char *buf) {
    int idx = 0;
    for (int i = 0; i < buffer_size; i++) {
        int curr = buf[i] - 'a';
        if (!trie[idx][curr]) trie[idx][curr] = trie_cnt++;
        idx = trie[idx][curr];
        cnt[idx]++;
    }
}
 
int query(int buffer_size, char *buf) {
    int idx = 0;
    for (int i = 0; i < buffer_size; i++) {
        int curr = buf[i] - 'a';
        idx = trie[idx][curr];
    }
    return cnt[idx];
}
 
 
 
 

'알고리즘 > SW Expert Academy' 카테고리의 다른 글

[SWEA] 1225 암호생성기  (0) 2020.02.03
[SWEA] 1855 영준이의 진짜 BFS  (0) 2020.01.15
[SWEA] 9092 마라톤  (0) 2020.01.14
[SWEA] 8993 하지 추측  (0) 2020.01.14
[SWEA] 9088 다이아몬드  (0) 2020.01.14
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/12   »
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
글 보관함