※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 2379번 문제인 트리 탐색하기이다.
문제는 아래 링크를 확인하자.
https://www.acmicpc.net/problem/2379
2379번: 트리 탐색하기
n개의 정점으로 이루어진 트리가 있다. 이와 같은 트리를 DFS와 비슷한 방식으로 탐색하려 한다. 탐색을 시작할 때에는 트리의 한 정점에서 시작하여, 한 번도 지나지 않은 간선을 따라서 다음 정
www.acmicpc.net
한국어 번역 지문으로 알기 어려워 추가하면, 이 문제는 단순히 두 트리가 동형인지를 확인하는 문제가 아닌 출발점을 root로 하는 두 rooted tree가 동형인지를 확인하는 문제이다.
입력제한이 충분히 작으므로 Tree Isomorphism에 대한 AHU algorithm(Aho-Hopcroft-Ullman algorithm)에 사용되는, 루트가 고정된 트리에 대하여 탐색순서에 무관하게 얻을 수 있는 트리 고유의 문자열을 찾는 코드를 작성해 문제를 해결하자.
아래는 제출한 소스코드이다.
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
int T;
void solve() {
string s1, s2; cin >> s1 >> s2;
vector<string> vec[3000];
int lv = 0;
for (auto& l : s1) {
if (l == '0') lv++;
else {
string tmp = "0";
sort(vec[lv].begin(), vec[lv].end());
for (auto& s : vec[lv]) tmp += s;
tmp += "1";
vec[lv].clear();
lv--;
vec[lv].emplace_back(tmp);
}
}
s1 = "";
sort(vec[0].begin(), vec[0].end());
for (auto&s:vec[0]) s1 += s;
vec[0].clear();
for (auto& l : s2) {
if (l == '0') lv++;
else {
string tmp = "0";
sort(vec[lv].begin(), vec[lv].end());
for (auto& s : vec[lv]) tmp += s;
tmp += "1";
vec[lv].clear();
lv--;
vec[lv].emplace_back(tmp);
}
}
s2 = "";
sort(vec[0].begin(), vec[0].end());
for (auto& s : vec[0]) s2 += s;
vec[0].clear();
if (s1 == s2) cout << 1 << '\n';
else cout << 0 << '\n';
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> T;
while (T--) solve();
}
728x90
'BOJ' 카테고리의 다른 글
[BOJ 26660 // C++] A + B (0) | 2023.07.20 |
---|---|
[BOJ 2275 // C++] 트리의 높이 줄이기 (0) | 2023.07.19 |
[BOJ 1344 // C++] 축구 (0) | 2023.07.17 |
[BOJ 15707 // C++] exceed or not (1) | 2023.07.16 |
[BOJ 2705 // C++] 팰린드롬 파티션 (0) | 2023.07.15 |