문제:icpc.me/5670
입력으로 들어오는 모든 문자열을 trie에 저장한 후 현재 확인중인 문자에서 다음 문자로 넘어가는 경로가 2 이상인 경우나 해당 지점에서 문자열이 끝나는 경우가 버튼을 눌러야 하는 경우이니 카운트를 증가시켜주어 return하는 쿼리를 구현하여 해결 가능하다.
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 | #include <cstdio> #include <algorithm> #include <cstring> #include <string> #include <iostream> using namespace std; struct trie { trie *go[26]; int gocnt; bool finished; trie() { gocnt = finished = 0; for (int i = 0; i < 26; i++) go[i] = NULL; } ~trie() { for (int i = 0; i < 26; i++) if (go[i])delete go[i]; } void insert(const char* key) { if (*key == '\0')finished = true; else { int next = *key - 'a'; if (!go[next]) { go[next] = new trie; gocnt++; } go[next]->insert(key + 1); } } int query(const char* key, int ret) { if (*key == '\0')return ret; else { if (gocnt > 1 || finished) ret++; int next = *key - 'a'; return go[next]->query(key + 1, ret); } } }; int t, n; char a[100001][82]; int main() { while (scanf("%d", &n) != EOF) { trie tr; for (int i = 0; i < n; i++) { scanf("%s", &a[i]); tr.insert(a[i]); } int cnt = 0; if (tr.gocnt == 1) cnt += n; for (int i = 0; i < n; i++) cnt += tr.query(a[i], 0); printf("%.2lf\n", (double)cnt / n); } return 0; } | cs |
'알고리즘 관련 > BOJ' 카테고리의 다른 글
BOJ)6850 Cows (0) | 2017.06.02 |
---|---|
BOJ)2254 감옥 건설 (0) | 2017.06.01 |
BOJ)5624 좋은 수 (0) | 2017.05.17 |
BOJ)12961 체스판2 (0) | 2017.05.17 |
BOJ)3654 L퍼즐 (0) | 2017.05.17 |