- 二进制枚举方案,然后判断所有方案
- emmm 虽然看起来有1e8,但我们加上
if ((int)hh.size() != h2 || (int)ww.size() != w2) continue;
这个剪枝
#include <iostream>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <vector>
#include <set>
#include <map>
#include <queue>
#include <stack>
#include <deque>
#include <sstream>
#include <unordered_set>
#include <unordered_map>
#include <bitset>
#define endl '\n'
#define _(a) cout << #a << ": " << (a) << " "
#define one first
#define two second
#define pb push_back
using namespace std;
template<class T> void chkmax(T &a, T b) {a = max(a, b);}
template<class T> void chkmin(T &a, T b) {a = min(a, b);}
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef pair<ll, int> pli;
typedef pair<int, ll> pil;
const int N = 13;
int h1, h2, w1, w2;
int g1[N][N], g2[N][N];
int main() {
ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
cin >> h1 >> w1;
for (int i = 0; i < h1; ++ i) for (int j = 0; j < w1; ++ j) cin >> g1[i][j];
cin >> h2 >> w2;
for (int i = 0; i < h2; ++ i) for (int j = 0; j < w2; ++ j) cin >> g2[i][j];
for (int i = 0; i < (1 << h1); ++ i) {
for (int j = 0; j < (1 << w1); ++ j) {
vector<int> ww, hh;
for (int k = 0; k < h1; ++ k) {
if (!((i >> k) & 1)) {
hh.push_back(k);
}
}
for (int k = 0; k < w1; ++ k) {
if (!((j >> k) & 1)) {
ww.push_back(k);
}
}
if ((int)hh.size() != h2 || (int)ww.size() != w2) continue;
bool ok = true;
for (int k = 0; k < h2; ++ k) {
for (int l = 0; l < w2; ++ l) {
if (g2[k][l] != g1[hh[k]][ww[l]]) {
ok = false;
break;
}
}
}
if (ok) {
cout << "Yes";
return 0;
}
}
}
cout << "No";
}