#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;
}
HDU 3791
最新推荐文章于 2021-04-07 22:46:14 发布