#include using namespace std; typedef vector vl; typedef complex C; void fft(vector& F, bool inv) { if (F.size() == 1) return; vector F0(F.size() >> 1), F1(F.size() >> 1); for (int i = 0; i < (F.size() >> 1); i++) { F0[i] = F[i << 1]; F1[i] = F[(i << 1) | 1]; } fft(F0, inv); fft(F1, inv); for (int i = 0; i < F.size(); i++) { F[i] = F0[i < F0.size() ? i : i - F0.size()] + polar(1., (inv ? -1 : 1) * acos(-1.) * 2 * i / F.size()) * F1[i < F1.size() ? i : i - F1.size()]; } if (inv) for(auto& v : F) v /= 2; } vl conv(const vl& f,const vl& g) { if (f.empty() || g.empty()) return {}; int n = 1; while (n <= f.size() + g.size()) n <<= 1; vector F(n), G(n); for (int i = 0; i < f.size(); i++) F[i] = f[i]; for (int i = 0; i < g.size(); i++) G[i] = g[i]; fft(F, false); fft(G, false); vector H(n); for (int i = 0; i < n; i++) H[i] = F[i] * G[i]; fft(H, true); vl h(f.size() + g.size() - 1); for (int i = 0; i < h.size(); i++) h[i] = round(H[i].real()); return h; } int main(){ int X, Y, Z; cin >> Z >> Y >> X; vl SB(8 * X * Y * Z), SW(8 * X * Y * Z), TB(8 * X * Y * Z), TW(8 * X * Y * Z); for (int x = 0; x < X; x++) { for (int y = 0; y < Y; y++) { string S; cin >> S; for (int z = 0; z < Z; z++) { int t = z + 2 * Z * y + 4 * Y * Z * x; if (S[z] == 'B') { SB[t] = 1; SB[t + Z] = 1; SB[t + 2 * Y * Z] = 1; SB[t + 2 * Y * Z + Z] = 1; SB[t + 4 * X * Y * Z] = 1; SB[t + 4 * X * Y * Z + Z] = 1; SB[t + 4 * X * Y * Z + 2 * Y * Z] = 1; SB[t + 4 * X * Y * Z + 2 * Y * Z + Z] = 1; } if (S[z] == 'W') { SW[t] = 1; SW[t + Z] = 1; SW[t + 2 * Y * Z] = 1; SW[t + 2 * Y * Z + Z] = 1; SW[t + 4 * X * Y * Z] = 1; SW[t + 4 * X * Y * Z + Z] = 1; SW[t + 4 * X * Y * Z + 2 * Y * Z] = 1; SW[t + 4 * X * Y * Z + 2 * Y * Z + Z] = 1; } } } } for (int x = 0; x < X; x++) { for (int y = 0; y < Y; y++) { string T; cin >> T; for (int z = 0; z < Z; z++) { int t = z + 2 * Z * y + 4 * Y * Z * x; if (T[z] == 'B') TB[t] = 1; if (T[z] == 'W') TW[t] = 1; } } } reverse(TB.begin(), TB.end()); reverse(TW.begin(), TW.end()); auto P = conv(SW, TB); auto Q = conv(SB, TW); int ans = X * Y * Z; for (int x = 0; x < X; x++) { for (int y = 0; y < Y; y++) { for (int z = 0; z < Z; z++) { int t = z + 2 * Z * y + 4 * Y * Z * x; t += 8 * X * Y * Z - 1; ans = min(ans, int(P[t] + Q[t])); } } } cout << ans << endl; return 0; }