8000 Merge pull request #421 from Joshua-Shin/master · sihyeon-kim/basic-algo-lecture@6424b66 · GitHub
[go: up one dir, main page]

Skip to content

Commit 6424b66

Browse files
Merge pull request encrypted-def#421 from Joshua-Shin/master
Update 16906.cpp
2 parents f51517d + f40aa92 commit 6424b66

File tree

1 file changed

+77
-5
lines changed

1 file changed

+77
-5
lines changed

0x1F/solutions/16906.cpp

Lines changed: 77 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,83 @@
1-
// Authored by : BaaaaaaaaaaarkingDog
1+
// Authored by : Joshua-Shin
22
// Co-authored by : -
3-
// http://boj.kr/****************
3+
// http://boj.kr/e98d872814c54797b4f8a2bb47632e3f
44
#include <bits/stdc++.h>
55
using namespace std;
66

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() {
855
ios::sync_with_stdio(0);
956
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

Comments
 (0)
0