혼종 꼬지마루
[백준] 1764 - 듣보잡 본문
알고리즘 단톡방에 어떤분의 요청으로 stl map이나 hash를 사용하지 않고 푼 코드가 있냐고 물어보길래 trie를 사용해서 풀어보았다
1. N개의 문자열이 들어오는 순서대로 TRIE안에 넣어준다.
- 이때 마지막 문자열의 길이가 끝날 때는 NODE의 end를 true로 바꾸어 노드가 끝났음(문자열의 마지막)을 표시한다.
2. 이 후 M개의 문자열이 들어오는 순서대로 N개의 문자열이 들어 있는 TRIE에 넣어 비교한다.
3. 문자열이 탐색하다가 next 문자가 NULL포인터를 가지거나, 문자열이 끝났음에도 end가 false인 경우는 그냥 리턴
4. 찾을 경우에는 dab_cnt를 하나 늘려서 리턴한다
5. check함수를 모두 빠져 나왔을 때 답을 찾은 것인지 체크하기 위한 check_num과 비교하여 달라 졌을 경우에는 dab배열에 str을 복사해서 넣는다.
- 그리고는 check_num을 갱신한다.
6. 답의 갯수를 출력하고 사전순으로 답을 정렬한 다음 출력(이 부분은 귀찮아서 stl을 사용함...)
7. 메모리 해제 후 종료
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 88 | #include <iostream> #include <malloc.h> #include <cstring> #include <algorithm> #include <vector> using namespace std; typedef struct NODE { bool end; NODE *next[30]; }node; NODE *makenode() { NODE*tmp = (NODE*)malloc(sizeof(NODE)); tmp->end = false; for (int i = 0; i < 26; i++) tmp->next[i] = NULL; return tmp; } int dab_cnt; char dab[500001][21]; void insert(int d, NODE *root, char *buff) { NODE *tmp = root; if (strlen(buff) == d) { tmp->end = true; return; } if (tmp->next[buff[d] - 'a'] == NULL) { tmp->next[buff[d] - 'a'] = makenode(); } insert(d + 1, tmp->next[buff[d] - 'a'], buff); } void check(int d, NODE *root, char*buff) { NODE*tmp = root; if (strlen(buff) == d) { if (tmp->end) dab_cnt++; return; } if (tmp->next[buff[d] - 'a'] == NULL) return; else { check(d + 1, tmp->next[buff[d] - 'a'], buff); } } void del(NODE* root) { NODE *tmp = root; for (int i = 0; i < 26; i++) { if (tmp->next[i] != NULL) del(tmp->next[i]); } free(tmp); } int main(void) { int N, M; NODE *root = makenode(); cin >> N >> M; for (int i = 0; i < N; i++) { char str[21]; cin >> str; insert(0, root, str); } int check_num = dab_cnt; for (int i = 0; i < M; i++) { char str[21]; cin >> str; check(0, root, str); if (check_num != dab_cnt) { for (int j = 0; j < strlen(str); j++) dab[check_num][j] = str[j]; check_num = dab_cnt; } } cout << dab_cnt << endl; vector<string> arr; for (int i = 0; i < dab_cnt; i++) arr.push_back(dab[i]); sort(arr.begin(), arr.end()); for (int i = 0; i < arr.size(); i++) { cout << arr[i].c_str() << endl; } del(root); return 0; } | cs |
'Algorithms > TRIE' 카테고리의 다른 글
[SWEA] 1257 - K번째 문자열 (0) | 2018.11.11 |
---|---|
[SWEA] 1256 - K번째 접미어 (0) | 2018.11.11 |
[SWEA] 3135 - 홍준이의 사전놀이 (0) | 2018.09.03 |
[백준] 5052 - 전화번호 목록 (0) | 2018.08.26 |
[백준] 9934 - 완전 이진 트리 (0) | 2018.08.26 |