HDU 3791

#include<algorithm>
#include<cstring>
#include<vector>
#include<cstdio>
#include<cmath>
#include<queue>
using namespace std;
char y[15], x[15];
struct Node
{
    int va, l, r;
} nod[2][15];
int r[2];
void build(int t,int k,int p)
{
    if(t<nod[k][p].va)
    {
        if(nod[k][p].l==-1)
        {
            nod[k][r[k]].va=t;
            nod[k][r[k]].l=nod[k][r[k]].r=-1;
            nod[k][p].l=r[k];
            r[k]++;
        }
        else build(t,k,nod[k][p].l);
    }
    else
    {
        if(nod[k][p].r==-1)
        {
            nod[k][r[k]].va=t;
            nod[k][r[k]].l=nod[k][r[k]].r=-1;
            nod[k][p].r=r[k];
            r[k]++;
        }
        else build(t,k,nod[k][p].r);
    }
}
bool cmp(int st,int sp)
{
    int i, j;
    Node a, b;
    a=nod[0][st], b=nod[1][sp];
    if(a.va==b.va&&((a.l!=-1&&b.l!=-1)||(a.l==-1&&b.l==-1))&&((a.r==-1&&b.r==-1)||(a.r!=-1&&b.r!=-1)))
    {
        bool flag1, flag2;
        flag1=flag2=true;
        if(a.l!=-1)
        {
            if(!cmp(a.l,b.l))
                flag1=false;
        }
        if(a.r!=-1)
        {
            if(!cmp(a.r,b.r))
                flag2=false;
        }
        if(flag1&&flag2)
            return true;
    }
    return false;
}
int main()
{
    int i, j, n;
    while(scanf("%d",&n)!=EOF)
    {
        if(n==0) break;
        scanf("%s",x);
        nod[0][0].va=x[0]-'0';
        nod[0][0].l=nod[0][0].r=-1;
        r[0]=1;
        int len=strlen(x);
        for(i=1; i<len; i++)
        {
            build(x[i]-'0',0,0);
        }
        while(n--)
        {
            scanf("%s",y);
            nod[1][0].va=y[0]-'0';
            nod[1][0].l=nod[1][0].r=-1;
            len=strlen(y);
            r[1]=1;
            for(i=1; i<len; i++)
            {
                build(y[i]-'0',1,0);
            }
            if(cmp(0,0))
                puts("YES");
            else puts("NO");
        }

    }
    return 0;
}

posted @ 2013-08-08 14:20  Ink_syk  阅读(113)  评论(0编辑  收藏  举报