Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
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
Tags
more
Archives
Today
Total
관리 메뉴

혼종 꼬지마루

[SWEA] 1256 - K번째 접미어 본문

Algorithms/TRIE

[SWEA] 1256 - K번째 접미어

꼬지마루 2018. 11. 11. 18:27

https://www.swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV18GHd6IskCFAZN

(이 글이 문제가 될 시 삭제하도록 하겠습니다.)


TRIE 유형을 다시 공부하게 되는 계기가 되었다.


접미어가 나올 수 있는 갯수가 문자열의 숫자랑 같기 때문에 그렇게 탐색에 많이 걸리지는 않는다.


입력받는 문자열을 모두 TRIE로 접미어화 시켜서 입력한다.


그 후에 문자열을 모두 끝까지 순회하면서 검색한다. 끝에 도달했을 때 숫자를 세면서 K번째가 되는 접미어를 찾는다.


순회하며 탐색할때는 vector로 구현해줘도 되고, 단순히 배열로 해줘도 되는데 간편하게 vector로 구현했다.


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
#include <iostream>
#include <malloc.h>
#include <cstring>
#include <vector>
using namespace std;
 
typedef struct NODE {
    int cnt[27];
    bool end;
    NODE* next[27];
}node;
 
int T, K, sum;
vector<char> dab;
 
node* makenode()
{
    node*tmp = (node*)malloc(sizeof(node));
    for (int i = 0; i < 27; i++)
    {
        tmp->next[i] = 0;
        tmp->cnt[i] = 0;
    }
    tmp->end = false;
    return tmp;
}
 
void insert(node *root, char* str, int st, int ed)
{
    node *tmp = root;
    if (st == ed) {
        tmp->end = truereturn; }
    if (!tmp->next[str[st] - 'a']) tmp->next[str[st] - 'a'= makenode();
    tmp->cnt[str[st] - 'a'+= 1;
    insert(tmp->next[str[st] - 'a'], str, st + 1, ed);
}
 
void find(node *root)
{
    node* tmp = root;
    if (tmp->end) sum++;
    if (sum == K) return;
    for (int i = 0; i < 27; i++)
        if (tmp->next[i])
        {
            dab.push_back(i + 'a');
            find(tmp->next[i]);
            if (sum == K) return;
            dab.pop_back();
        }
}
 
void deltrie(node *root)
{
    node *tmp = root;
    for (int i = 0; i < 27; i++)
        if (tmp->next[i]) deltrie(tmp->next[i]);
    free(tmp);
}
 
int main(void)
{
    cin >> T;
    for (int tc = 1; tc <= T; tc++)
    {
        char arr[402];
        sum = 0;
        cin >> K;
        cin >> arr;
        int len = strlen(arr);
        while (!dab.empty()) dab.pop_back();
        node *root = makenode();
        for (int i = 0; i < len; i++)
        {
            if (!root->next[arr[i] - 'a']) root->next[arr[i] - 'a'= makenode();
            root->cnt[arr[i] - 'a'+= 1;
            insert(root->next[arr[i] - 'a'], arr, i + 1, len);
        }
        find(root);
        deltrie(root);
        cout << "#" << tc << " ";
        for (int i = 0; i < dab.size(); i++)
            cout << dab[i];
        cout << endl;
    }
    return 0;
}
cs

'Algorithms > TRIE' 카테고리의 다른 글

[백준] 1764 - 듣보잡  (0) 2019.06.02
[SWEA] 1257 - K번째 문자열  (0) 2018.11.11
[SWEA] 3135 - 홍준이의 사전놀이  (0) 2018.09.03
[백준] 5052 - 전화번호 목록  (0) 2018.08.26
[백준] 9934 - 완전 이진 트리  (0) 2018.08.26