※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 5446번 문제인 용량 부족이다.
문제는 아래 링크를 확인하자.
https://www.acmicpc.net/problem/5446
5446번: 용량 부족
팀포2 덕후 연수는 팀포2를 다운받던 도중 하드 용량이 부족하다는 것을 알았다. 이때는 침착하게 팀포2를 하지 말거나 하드를 새로 사면 되지만 불가능했고, 결국 하드에서 쓸모없는 파일을 지
www.acmicpc.net
주어진 문자열들의 집합은 trie를 이용해 표현 및 관리할 수 있다.
trie의 각 노드에 해당 노드가 나타내는 문자열을 prefix로 갖는 "지워야하는 문자열"의 개수와 "지우지 말아야 할 문자열의 개수", 그리고 "해당 노드로 끝나는 문자열의 존재여부"의 정보를 기록해두면 trie 위에서의 DFS를 통해 작성해야 할 명령을 합산하는 것으로 문제를 해결할 수 있다.
아래는 제출한 소스코드이다.
#include <iostream>
#include <string>
using namespace std;
typedef unsigned short ushort;
struct node {
ushort cnt1 = 0, cnt2 = 0;
ushort child[63] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 };
bool chk = 0;
node() {};
};
node trie[40001];
int N1, N2;
ushort dfs(int id) {
node& cur = trie[id];
if (cur.cnt1 == 0) return 0;
if (cur.cnt2 == 0) return 1;
ushort ret = 0;
for (auto& x : cur.child) {
if (x) ret += dfs(x);
}
if (cur.chk) ret++;
return ret;
}
void solve() {
trie[0] = node();
cin >> N1;
ushort trieid = 0;
while (N1--) {
string s; cin >> s; ushort cur = 0;
for (auto& l : s) {
trie[cur].cnt1++;
int idx;
if ('0' <= l && l <= '9') idx = l - '0';
else if ('a' <= l && l <= 'z') idx = l - 'a' + 10;
else if ('A' <= l && l <= 'Z') idx = l - 'A' + 36;
else idx = 62;
ushort& nxt = trie[cur].child[idx];
if (nxt == 0) {
nxt = ++trieid;
trie[nxt] = node();
}
cur = nxt;
}
trie[cur].cnt1++;
trie[cur].chk = 1;
}
cin >> N2;
while (N2--) {
string s; cin >> s; ushort cur = 0;
for (auto& l : s) {
trie[cur].cnt2++;
int idx;
if ('0' <= l && l <= '9') idx = l - '0';
else if ('a' <= l && l <= 'z') idx = l - 'a' + 10;
else if ('A' <= l && l <= 'Z') idx = l - 'A' + 36;
else idx = 62;
ushort& nxt = trie[cur].child[idx];
if (nxt == 0) {
nxt = ++trieid;
trie[nxt] = node();
}
cur = nxt;
}
trie[cur].cnt2++;
}
cout << dfs(0) << '\n';
}
int T;
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> T;
while (T--) solve();
}
728x90
'BOJ' 카테고리의 다른 글
[BOJ 2242 // C++] 삼각형 만들기 (0) | 2023.07.06 |
---|---|
[BOJ 2107 // C++] 포함하는 구간 (1) | 2023.07.05 |
[BOJ 2159 // C++] 케익 배달 (0) | 2023.07.03 |
[BOJ 10711 // C++] 모래성 (0) | 2023.07.02 |
[BOJ 17136 // C++] 색종이 붙이기 (0) | 2023.07.01 |