这个题目是判断给定的两个序列是不是对同一棵树的遍历结果,也就是树的同构问题。首先可以求出一每个节点为根的子树的孩子节点的数目(包括该节点),然后对节点数目进行排序,那么这个排序的序列即可作为该树的一个最小表示,然后我们只需要判断两棵树的最小表示是不是相同即可。对于题目中给定的01序列是对于树的遍历结果,对于每一棵子树必定有相同个数的0和1,我们可以依据来求出序列中每个节点的儿子节点的个数。具体看代码中dfs函数。添加的0和1用于描述根节点。
#include <iostream>
#include <cstring>
#include <string>
#include <algorithm>
using namespace std ;
const int maxn = 3005 ;
int numa[maxn] ;
int numb[maxn] ;
int rear ;
void dfs(string str , int *num){
if(str[rear]=='0')
num[rear] = 1 ;
if(str[rear]=='0' && str[rear + 1] == '1'){
rear ++ ;
return ;
}
int current = rear ;
while(++rear < str.size() && str[rear]!= '1'){
int child = rear ;
dfs(str , num) ;
num[current] += num[child] ;
}
return ;
}
int main(){
int T ;
cin>>T ;
while(T--){
string stra ;
string strb ;
memset(numa , 0 , sizeof(numa)) ;
memset(numb , 0 , sizeof(numb)) ;
cin>>stra ;
cin>>strb ;
if(stra.size() != strb.size()){
cout<<"different"<<endl;
continue ;
}
rear = 0 ;
stra = "0" + stra + "1" ;
dfs(stra , numa) ;
rear= 0 ;
strb = "0" + strb + "1" ;
dfs(strb , numb) ;
sort(numa , numa + stra.size() ) ;
sort(numb , numb + strb.size() ) ;
int len= stra.size() ;
int i ;
for(i = 0 ; i < len ; i ++){
if(numa[i] != numb[i])
break ;
}
if(i== len)
cout<<"same"<<endl ;
else{
cout<<"different"<<endl;
}
}
return 0 ;
}