#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>

typedef struct BTreeNode {
    int data;
    struct BTreeNode* lchild;
    struct BTreeNode* rchild;
} BTreeNode, *BTree;

BTreeNode* create(int data) {
    BTreeNode* root = (BTreeNode*)malloc(sizeof(BTreeNode));
    root->data = data;
    root->lchild = NULL;
    root->rchild = NULL;
    return root;
}

BTreeNode* Insert(BTreeNode* root, int x) {
    if (root == NULL) {
        return create(x);
    } else if (root->data > x) {
        root->lchild = Insert(root->lchild, x);
    } else if (root->data < x) {
        root->rchild = Insert(root->rchild, x);
    }
    return root;
}

bool isSameBST(BTreeNode* root1, BTreeNode* root2) {
    // 如果两个节点都是空节点,那么它们被认为是相同的(空树与空树相同)
    if (root1 == NULL && root2 == NULL) {
        return true;
    }
    // 如果其中一个节点为空,而另一个节点不为空,那么它们一定不同
    if (root1 == NULL || root2 == NULL) {
        return false;
    }
    // 如果两个节点都不为空,但是它们的数据值不同,那么它们一定不同
    if (root1->data != root2->data) {
        return false;
    }
    // 如果两个节点都不为空且数据值相同,那么递归地比较它们的左子树和右子树
    // 只有当左子树和右子树都相同时,这两个节点才被认为是相同的
    return isSameBST(root1->lchild, root2->lchild) &&
           isSameBST(root1->rchild, root2->rchild);
}

bool buildAndCompare(char* seq1, char* seq2, int len) {
    BTree root1 = NULL, root2 = NULL;
    for (int i = 0; i < len; i++) {
        root1 = Insert(root1, seq1[i] - '0');
    }
    for (int i = 0; i < len; i++) {
        root2 = Insert(root2, seq2[i] - '0');
    }
    return isSameBST(root1, root2);
}

int main() {
    int n;
    while (scanf("%d", &n) != EOF && n != 0) {
        char seq1[11];
        scanf("%s", seq1);
        int len = strlen(seq1);
        while (n--) {
            char seq2[11];
            scanf("%s", seq2);
            if (buildAndCompare(seq1, seq2, len)) {
                printf("YES\n");
            } else {
                printf("NO\n");
            }
        }
    }
    return 0;
}