혼종 꼬지마루
[SWEA] 1256 - K번째 접미어 본문
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 = true; return; } 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 |