http://acm.split.hdu.edu.cn/showproblem.php?pid=3791
#include <stdio.h>
#include <algorithm>
#include <iostream>
#define maxs 5010
#include <string.h>
#define MME(i,j) memset(i,j,sizeof(i))
using namespace std;
int tree1[10010];
int tree2[10010];
char str[maxs];
void Insert(int son,int *tre)
{
int now=1;
while(tre[now]!=-1)
{
if(tre[now]<son)
now=2*now+1;//右孩子
else now*=2;
}
tre[now]=son;
}
void build(char *s,int *tr)
{
int len=strlen(s);
tr[1] = s[0]-'0';
for( int i=1;i<len;i++ )
{
Insert( s[i]-'0',tr );
}
}
int main()
{
int n;
bool flag;
while(~scanf("%d",&n)&& n)
{
flag=1;
MME(tree1,-1);
//MME(tree2,-1);
scanf("%s",str);
build(str,tree1);
for(int i=0;i<n;i++)
{
flag=1;
MME(tree2,-1);
scanf("%s",str);
build(str,tree2);
for(int ii=0;ii<5000;ii++)
{
if(tree1[ii]!=tree2[ii])
{
flag=0;
break;
}
}
if(flag)
puts("YES");
else puts("NO");
}
}
return 0;
}