#include <iostream>
#include <string>
#include <unordered_set>
#include <vector> // Cần thiết cho vector nếu dùng cấp phát động
using namespace std;
const int MAX_VIRUS_LENGTH = 10;
const int STATIC_THRESHOLD = 50000; // Ví dụ: Ngưỡng cho mảng tĩnh
int main() {
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
int n, m, q;
cin >> n >> m >> q;
cin.ignore();
char** a = nullptr; // Khởi tạo con trỏ mảng động
char static_a[n][m]; // Mảng tĩnh
bool use_static = (n * m <= STATIC_THRESHOLD);
if (use_static) {
for (int i = 0; i < n; ++i) {
for (int j = 0; j < m; ++j) {
cin >> static_a[i][j];
}
}
} else {
a = new char*[n]; // Cấp phát động
for (int i = 0; i < n; ++i) {
a[i] = new char[m];
}
for (int i = 0; i < n; ++i) {
for (int j = 0; j < m; ++j) {
cin >> a[i][j];
}
}
}
unordered_set<string> virus;
char temp[11];
for (int i = 0; i < n; ++i) {
for (int j = 0; j < m; ++j) {
for (int len = 2; len <= 10 && j + len <= m; ++len) {
for (int k = 0; k < len; ++k) {
temp[k] = use_static ? static_a[i][j + k] : a[i][j + k];
}
temp[len] = '\0';
virus.insert(string(temp));
}
}
}
for (int j = 0; j < m; ++j) {
for (int i = 0; i < n; ++i) {
for (int len = 2; len <= 10 && i + len <= n; ++len) {
for (int k = 0; k < len; ++k) {
temp[k] = use_static ? static_a[i + k][j] : a[i + k][j];
}
temp[len] = '\0';
virus.insert(string(temp));
}
}
}
while (q--) {
string x;
cin >> x;
if (virus.find(x) == virus.end())
cout << 0;
else
cout << 1;
}
if (!use_static) { // Giải phóng bộ nhớ nếu dùng mảng động
for (int i = 0; i < n; ++i) {
delete[] a[i];
}
delete[] a;
}
return 0;
}