#include <iostream>
#include <vector>
#include <algorithm>
#include <cassert>
using ll = long long;
#define debug(x) #x << " = " << x << '\n'
const int NMAX = 3000;
char a[NMAX][NMAX];
int vertical[NMAX][NMAX], horizontal[NMAX][NMAX];
int main() {
#ifdef LOCAL
freopen("input.txt", "r", stdin);
#endif
std::ios_base::sync_with_stdio(false);
std::cin.tie(0);
int n, m;
std::cin >> n >> m;
for (int i = 0; i < n; i++) {
std::string s;
std::cin >> s;
for (int j = 0; j < m; j++) {
a[i][j] = s[j];
}
}
std::vector<int> vertl, vertr;
std::vector<std::pair<int, int>> edges;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
vertical[i][j] = horizontal[i][j] = -1;
}
}
for (int i = 0; i + 2 < n; i++) {
for (int j = 0; j < m; j++) {
if (a[i][j] == 'R' && a[i + 1][j] == 'G' && a[i + 2][j] == 'W') {
vertl.push_back(i * m + j);
vertical[i][j] = vertical[i + 1][j] = vertical[i + 2][j] = i * m + j;
}
}
}
for (int i = 0; i < n; i++) {
for (int j = 0; j + 2 < m; j++) {
if (a[i][j] == 'R' && a[i][j + 1] == 'G' && a[i][j + 2] == 'W') {
vertr.push_back(i * m + j);
horizontal[i][j] = horizontal[i][j + 1] = horizontal[i][j + 2] = i * m + j;
}
}
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (vertical[i][j] != -1 && horizontal[i][j] != -1) {
edges.push_back({vertical[i][j], horizontal[i][j]});
}
}
}
std::sort(vertl.begin(), vertl.end());
vertl.erase(std::unique(vertl.begin(), vertl.end()), vertl.end());
std::sort(vertr.begin(), vertr.end());
vertr.erase(std::unique(vertr.begin(), vertr.end()), vertr.end());
for (auto &[x, y] : edges) {
x = std::lower_bound(vertl.begin(), vertl.end(), x) - vertl.begin();
y = std::lower_bound(vertr.begin(), vertr.end(), y) - vertr.begin();
}
int answer = 0;
int L = (int) vertl.size();
int R = (int) vertr.size();
for (int mask = 0; mask < (1 << (L + R)); mask++) {
int st = 0, dr = 0;
std::vector<std::vector<int>> cnt(n, std::vector<int>(m, 0));
for (int i = 0; i < L + R; i++) {
if (mask >> i & 1) {
if (i < L) {
int x = vertl[i] / m, y = vertl[i] % m;
cnt[x][y]++;
cnt[x + 1][y]++;
cnt[x + 2][y]++;
} else {
int x = vertr[i - L] / m, y = vertr[i - L] % m;
cnt[x][y]++;
cnt[x][y + 1]++;
cnt[x][y + 2]++;
}
}
}
bool ok = true;
for (const auto &[x, y] : edges) {
if (mask >> x & 1) {
if (mask >> (y + L) & 1) {
ok = false;
break;
}
}
}
if (ok) {
answer = std::max(answer, __builtin_popcount(mask));
}
}
std::cout << answer;
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |