思路:按照题意,可以有多重不同的01串表示同一颗树,这里不能直接用字符串的最小表示来得到树的最小表示,对于中央车站,它有多个不同的子树,所以应该将子树的最小表示串当做一个字母最后得到一个字典序的串,这里需要递归处理每一个子树,叶节点的最小表示串为空。
以下用一个已经是最小表示的树来演示以下过程
左树 右树
a=0(00011011+001011)1 (里面已经加了前置0和后置1)
代码:
#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
using namespace std;
const int N=1e4;
char a[N],b[N];
string dfs(string &a,int &u)
{
vector<string>as;
u++;
while(a[u]=='0') as.push_back(dfs(a,u));
u++;
sort(as.begin(),as.end());
string res="0";
for(auto s:as) res+=s;
res+='1';
return res;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
string a,b;
cin>>a>>b;
a='0'+a+'1';
b='0'+b+'1';
int ua=0,ub=0;
if(dfs(a,ua)==dfs(b,ub))puts("same");
else puts("different");
}
return 0;
}