/* Wed Nov 12 19:57:34 JST 2003 : Start */ /* Wed Nov 12 20:33:40 JST 2003 : Accepted */ #include #include int n, m; char word[100][100]; char cube[30][30][30]; int out(int x, int y, int z) { return (x < 0 || x >= m || y < 0 || y >= m || z < 0 || z >= m); } int match(char w[21], int x, int y, int z, int dx, int dy, int dz) { int i, len; len = strlen(w); for (i = 0; i < len; i++) { if (out(x+dx*i, y+dy*i, z+dz*i) || cube[x+dx*i][y+dy*i][z+dz*i] != w[i]) { return 0; } } return 1; } int search(char w[21]) { int i, j, k, di, dj, dk, len; len = strlen(w); for (i = 0; i < m; i++) { for (j = 0; j < m; j++) { for (k = 0; k < m; k++) { if (cube[i][j][k] == w[0]) { for (di = -1; di <= 1; di++) { for (dj = -1; dj <= 1; dj++) { for (dk = -1; dk <= 1; dk++) { if (di == 0 && dj == 0 && dk == 0) { continue; } if (match(w, i, j, k, di, dj, dk)) { if (out(i-di, j-dj, k-dk)) { return cube[i+di*len][j+dj*len][k+dk*len]; } else { return cube[i-di][j-dj][k-dk]; } } } } } } } } } return 0; } int main() { int i, j, found; char s[1024], *p; // freopen("prince.in", "r", stdin); gets(s); sscanf(s, "%d,%d", &n, &m); for (i = 0; i < n; i++) { gets(word[i]); } for (i = 0; i < m; i++) { gets(s); p = strtok(s, ","); for (j = 0; j < m; j++) { strcpy(cube[i][j], p); p = strtok(NULL, ","); } } for (i = 0; i < n; i++) { if (found = search(word[i])) { printf("%c", found); } } printf("\n"); return 0; }