【二叉搜索树】hdu 3791
http://acm.hdu.edu.cn/showproblem.php?pid=3791
【注意】
是看树的形态是否一样,而不是中序遍历的结果
【Accepted】
#include<iostream> #include<cstdio> #include<cstring> #include<string> #include<algorithm> #include<queue> using namespace std; const int maxn=(1<<10)+2; char str[12]; int num1[maxn]; int num2[maxn]; int len1,len2; int n; void build1(){ for(int i=0;i<len1;i++){ int cur=1; while(num1[cur]!=-1){ if(str[i]-'0'>num1[cur]){ cur=(cur<<1)+1; }else{ cur=cur<<1; } } num1[cur]=str[i]-'0'; } } void build2(){ for(int i=0;i<len2;i++){ int cur=1; while(num2[cur]!=-1){ if(str[i]-'0'>num2[cur]){ cur=(cur<<1)+1; }else{ cur=cur<<1; } } num2[cur]=str[i]-'0'; } } bool flag; int main(){ while(scanf("%d",&n)&&n){ memset(num1,-1,sizeof(num1)); scanf("%s",str); len1=strlen(str); build1(); // for(int i=1;i<=len1;i++){ // cout<<num1[i]<<" "; // } // cout<<endl; for(int i=0;i<n;i++){ scanf("%s",str); flag=true; memset(num2,-1,sizeof(num2)); len2=strlen(str); if(len1!=len2){ puts("NO"); continue; } build2(); for(int j=1;j<maxn;j++){ if(num1[j]!=num2[j]){ flag=false; break; } } if(flag) puts("YES"); else puts("NO"); } } return 0; }