#include using namespace std; using Hash = long long; const int N = 2024; Hash p[N], q[N]; void init() { p[0] = q[0] = 1; p[1] = 239; q[1] = 257; for (int i = 2; i < N; i++) { p[i] = p[i - 1] * p[1]; q[i] = q[i - 1] * q[1]; } } struct matrix { int n, m; vector a; vector> s; void read() { scanf("%d%d", &n, &m); a.resize(n); for (int i = 0; i < n; i++) { static char buf[(int)1.01e6]; scanf("%s", buf); a[i] = buf; } s.assign(n + 1, vector(m + 1)); for (int i = 1; i <= n; i++) { for (int j = 1; j <= m; j++) { s[i][j] = s[i][j - 1] + s[i - 1][j] - s[i - 1][j - 1] + a[i - 1][j - 1] * p[i] * q[j]; } } } Hash get(int x1, int y1, int x2, int y2) { Hash res = s[x2 + 1][y2 + 1] - s[x1][y2 + 1] - s[x2 + 1][y1] + s[x1][y1]; res *= p[N - 1 - x1]; res *= q[N - 1 - y1]; return res; } }; int main() { init(); matrix a, b; a.read(); b.read(); auto h = a.get(0, 0, a.n - 1, a.m - 1); vector> s(b.n + 1, vector(b.m + 1)); for (int i = 0; i + a.n <= b.n; i++) { for (int j = 0; j + a.m <= b.m; j++) { if (h == b.get(i, j, i + a.n - 1, j + a.m - 1)) { s[i][j]++; s[i + a.n][j]--; s[i][j + a.m]--; s[i + a.n][j + a.m]++; } } } for (int i = 0; i < b.n; i++) { for (int j = 0; j < b.m; j++) { if (i) s[i][j] += s[i - 1][j]; if (j) s[i][j] += s[i][j - 1]; if (i && j) s[i][j] -= s[i - 1][j - 1]; if (!s[i][j]) { b.a[i][j] = '.'; } } } for (auto s : b.a) { printf("%s\n", s.c_str()); } }