题面
题解
1.题意就是问给定的字符串对应的树是否是同构的,我们先来说一下概念
2. 对于树的遍历,从根节点开始0代表向下遍历,1代表向上回溯, 我们遍历树就会得到dfs序,也可以根据dfs序画出树,两颗拓扑序相同的树,我们就可以看作是同构树
3.如何判断两个树是不是同构:求出每个树的最小表示。即与这棵树同构的最小的dfs序。如果两个树同构,那么这两个树的最小表示 应该相同。 求树的最小表示可以递归实现,求出所有子树的dfs序,然后从小到大排序拼接起来
代码
#include<bits/stdc++.h>
using namespace std;
string dfs(string &seq, int &u) {
vector<string> seqs;
u++; //跳过边界
//只有是0才会向下,才有子树
while (seq[u] == '0') {
//把子树的dfs序放入
seqs.push_back(dfs(seq, u));
}
u++;//向上回溯
//给子树dfs序排列
sort(seqs.begin(), seqs.end());
string res = "0";
for (auto x:seqs) {
res += x;
}
res += '1';
return res;
}
int main() {
int t;
cin >> t;
while (t--) {
string a, b;
cin >> a >> b;
//在根节点上再拼接一个节点处理边界
a = '0' + a + '1';
b = '0' + b + '1';
int ua = 0, ub = 0;
auto sa = dfs(a, ua), sb = dfs(b, ub);
if (sa == sb) cout << "same" << endl;
else cout << "different" << endl;
}
return 0;
}