#include <iostream>
#include <cstdio>
#include <string>

using namespace std;

typedef char ElementType;

struct TreeNode {
    ElementType data;
    TreeNode* leftChild;
    TreeNode* rightChild;

    TreeNode(ElementType c) {
        this->data = c;
        this->leftChild = nullptr;
        this->rightChild = nullptr;
    }
};

TreeNode* insert(TreeNode* root, ElementType x);

void preOrder(TreeNode* root, string& order);

/**
 * 二叉搜索树--浙江大学
 * @return
 */
int main() {
    int n;
    while (cin >> n) {
        if (n == 0) {
            break;
        }
        string sequence;
        cin >> sequence;
        TreeNode* root = nullptr;
        for (int i = 0; i < sequence.size(); ++i) {
            root = insert(root, sequence[i]);
        }
        string order = "";
        preOrder(root, order);
        for (int j = 0; j < n; ++j) {
            string str;
            cin >> str;
            TreeNode* temp = nullptr;
            for (int i = 0; i < str.size(); ++i) {
                temp = insert(temp, str[i]);
            }
            string tmpOrder = "";
            preOrder(temp, tmpOrder);
            if (order == tmpOrder) {
                cout << "YES" << endl;
            } else {
                cout << "NO" << endl;
            }
        }
    }
    return 0;
}

TreeNode* insert(TreeNode* root, ElementType x) {
    if (root == nullptr) {
        /*
         * 创建新结点
         */
        root = new TreeNode(x);
    } else if (x < root->data) {
        /*
         * 插入到左子树
         */
        root->leftChild = insert(root->leftChild, x);
    } else if (x > root->data) {
        /*
         * 插入到右子树
         */
        root->rightChild = insert(root->rightChild, x);
    } else {
        /*
         * 题目说重复的元素无需输出,因此重复元素我们不进行插入
         */
    }
    return root;
}

void preOrder(TreeNode* root, string& order) {
    if (root == nullptr) {
        return;
    }
    /*
     * 根、左子树、右子树
     */
    order += root->data;
    preOrder(root->leftChild, order);
    preOrder(root->rightChild, order);
}