반응형
문제 출처 :
https://www.acmicpc.net/problem/5670
알고리즘 분석 :
문제 해결에 필요한 사항
1. 트라이
이 문제는 블로그에서 검색하면 하나 더 나오는데
지금것은 for문으로 트라이를 구성했고 검색해서 나오는 내용은 재귀로 트라이를 구성한 것의 차이뿐이다.
소스 코드 :
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 89 90 91 | #include <iostream> #include <cstdio> #include <queue> #include <string> using namespace std; const int MAX_NODE = 26; struct Trie { Trie *next[MAX_NODE]; bool isEnd; int child; Trie() { for (int i = 0; i < MAX_NODE; i++){ next[i] = nullptr; isEnd = false; child = 0; } } ~Trie() { for (int i = 0; i < MAX_NODE; i++) { if (next[i]) delete next[i]; } } void del() { for (int i = 0; i < MAX_NODE; i++) { if (next[i]) delete next[i]; } } }; int search(char *str, Trie *root) { Trie *pos = root; int ret = 0; for (int i = 0; i < str[i]; i++) { int nowCh = str[i] - 'a'; if (i && (pos->child >= 2 || (pos->child == 1 && pos->isEnd))) ret++; pos = pos->next[nowCh]; } return ret; } char str[100002][100]; int main() { int n; while (scanf("%d", &n) != EOF) { Trie *root = new Trie; for (int i = 0; i < n; i++) { scanf("%s", str[i]); Trie *pos = root; for (int j = 0; j < str[i][j]; j++) { int nowCh = str[i][j] - 'a'; if (pos->next[nowCh] == nullptr) { pos->next[nowCh] = new Trie; pos->child++; } pos = pos->next[nowCh]; } pos->isEnd = true; } int ans = n; for (int i = 0; i < n; i++) ans += search(str[i], root); printf("%.2lf\n", 1.0 * ans / n); root->del(); } return 0; } // This source code Copyright belongs to Crocus // If you want to see more? click here >> | Crocus |
반응형
'Applied > 알고리즘 문제풀이' 카테고리의 다른 글
[9882번] Balanced Teams (0) | 2018.09.21 |
---|---|
[15927번] 회문은 회문아니야!! (0) | 2018.09.19 |
[2591번] 숫자 카드 (0) | 2018.06.30 |
[13326번] Diameter (0) | 2018.06.28 |
[1708번] 볼록 껍질 (0) | 2018.06.27 |