【二叉搜索树】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;
}

 

posted @ 2018-06-13 17:20  shulin15  阅读(123)  评论(0编辑  收藏  举报