TRIE 문제.
입력되는 전화번호를 TREE형태로 저장한다.
한 TRIE 경로가 다른 TRIE 경로에 완전히 포함되는 경우 일관성이 없다고 한다.
이걸 찾기 위해서 TRIE구조 안에 bool값 두개 넣는다.
ce = child exist
ee = end exist
대충 이런의미로 넣었다.
TRIE에 전화번호 a를 삽입하는 도중에 ee == 1, 즉 그 부분을 마지막으로 하는 전화번호 b가 존재한다면 일관성이 없다.
또한 a를 삽입할 때 마지막 부분에서 ce == 1, 즉 a를 포함하는 전화번호 b가 존재한다면 일관성이 없다.
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 | #include <stdio.h> bool flag; struct TRIE { TRIE* c[10]; // child exist, ended bool ce, ee; TRIE() { for (int i = 0; i < 10; i++) c[i] = nullptr; ce = ee = false; } ~TRIE() { for (int i = 0; i < 10; i++) delete c[i]; } void insert(char* key) { if (*key == 0) { ee = true; if (ce) flag = 1; } else if (ee) flag = 1; else { int next = key[0] - '0'; ce = 1; if (!c[next]) c[next] = new TRIE; c[next]->insert(key + 1); } } }; int t, n; int main() { //freopen("Text.txt", "r", stdin); scanf("%d", &t); while (t--) { scanf("%d", &n); flag = false; TRIE* r = new TRIE; char s[12]; for (int i = 0; i < n; i++) { scanf("%s", &s); // TRIE if (!flag) r->insert(s); } printf(flag ? "NO\n" : "YES\n"); delete r; } return 0; } | cs |
'BOJ' 카테고리의 다른 글
1786 찾기 (0) | 2018.02.18 |
---|---|
5670 휴대폰 자판 (0) | 2018.02.18 |
1072 게임 (0) | 2018.02.18 |
11559 Puyo Puyo (0) | 2018.02.18 |
4963 섬의 개수 (0) | 2018.02.18 |