1
- // Authored by : BaaaaaaaaaaarkingDog
1
+ // Authored by : Joshua-Shin
2
2
// Co-authored by : -
3
- // http://boj.kr/****************
3
+ // http://boj.kr/e98d872814c54797b4f8a2bb47632e3f
4
4
#include < bits/stdc++.h>
5
5
using namespace std ;
6
6
7
- int main (void ){
7
+ const int MX = 1000 ;
8
+ int nxt[MX][2 ], root = 1 , unused = 2 , n;
9
+ bool chk[MX], success;
10
+ vector<pair<int , int >> v;
11
+ map<int , string> m; // 입력받은 수의 인덱스와 입력받은 수로 만든 문자열
12
+ string successStr;
13
+ int c2i (char c) {
14
+ return c - ' 0' ;
15
+ }
16
+ void initiate () {
17
+ for (int i = 0 ; i < 1000 ; i++) {
18
+ nxt[i][0 ] = -1 ;
19
+ nxt[i][1 ] = -1 ;
20
+ }
21
+ }
22
+ void insert (string &s) {
23
+ int cur = root;
24
+ for (auto c : s) {
25
+ if (nxt[cur][c2i (c)] == -1 )
26
+ nxt[cur][c2i (c)] = unused++;
27
+ cur = nxt[cur][c2i (c)];
28
+ }
29
+ chk[cur] = true ;
30
+ }
31
+ bool find (string &s) {
32
+ int cur = root;
33
+ for (auto c : s) {
34
+ if (nxt[cur][c2i (c)] == -1 )
35
+ return false ;
36
+ cur = nxt[cur][c2i (c)];
37
+ }
38
+ return chk[cur];
39
+ }
40
+ void dfs (int len, string s) {
41
+ if (success) return ;
42
+ if (s.size () == len) {
43
+ insert (s);
44
+ success = true ;
45
+ successStr = s;
46
+ }
47
+ string s2 = s + ' 0' ;
48
+ if (!find (s2)) dfs (len, s2);
49
+ if (success) return ;
50
+ string s3 = s + ' 1' ;
51
+ if (!find (s3)) dfs (len, s3);
52
+ return ;
53
+ }
54
+ int main () {
8
55
ios::sync_with_stdio (0 );
9
56
cin.tie (0 );
10
-
11
- }
57
+ cin >> n;
58
+ initiate ();
59
+ for (int i = 0 ; i < n; i++) {
60
+ int len;
61
+ cin >> len;
62
+ v.push_back ({len, i});
63
+ }
64
+ sort (v.begin (), v.end ());
65
+ for (int i = 0 ; i < v.size (); i++) {
66
+ auto [len, idx] = v[i];
67
+ success = false ;
68
+ dfs (len, " " );
69
+ if (!success) {
70
+ cout << -1 ;
71
+ return 0 ;
72
+ }
73
+ m[idx] = successStr;
74
+ }
75
+ cout << 1 << ' \n ' ;
76
+ for (int i = 0 ; i < n; i++)
77
+ cout << m[i] << ' \n ' ;
78
+ }
79
+ /*
80
+ 단어의 길이가 작은 순서대로 dfs 함수에 길이 값을 넣어 트라이에 생성한 문자열을 insert함.
81
+ dfs를 돌며 삽입이 가능한 곳이 한 군데라도 존재한다면 바로 함수를 빠져나오고,
82
+ 단 하나의 문자열이라도 insert에 성공하지 못하면 -1 출력하며 종료.
83
+ */
0 commit comments