Submission #1356819

#TimeUsernameProblemLanguageResultExecution timeMemory
1356819gayJOI 문장 (JOI14_ho_t1)C++20
100 / 100
49 ms1528 KiB
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>

using namespace std;

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);

    int M, N;
    if (!(cin >> M >> N)) return 0;

    vector<string> flag(M);
    for (int i = 0; i < M; ++i) {
        cin >> flag[i];
    }

    vector<string> emblem(2);
    for (int i = 0; i < 2; ++i) {
        cin >> emblem[i];
    }

    auto is_match = [&](int r, int c) {
        if (r < 0 || r >= M - 1 || c < 0 || c >= N - 1) return false;
        return flag[r][c] == emblem[0][0] &&
               flag[r][c + 1] == emblem[0][1] &&
               flag[r + 1][c] == emblem[1][0] &&
               flag[r + 1][c + 1] == emblem[1][1];
    };

    long long initial_count = 0;
    for (int i = 0; i < M - 1; ++i) {
        for (int j = 0; j < N - 1; ++j) {
            if (is_match(i, j)) {
                initial_count++;
            }
        }
    }

    long long max_gain = 0;
    char candidates[] = {'J', 'O', 'I'};

    for (int i = 0; i < M; ++i) {
        for (int j = 0; j < N; ++j) {
            int current_local = 0;
            for (int dr = -1; dr <= 0; ++dr) {
                for (int dc = -1; dc <= 0; ++dc) {
                    if (is_match(i + dr, j + dc)) {
                        current_local++;
                    }
                }
            }

            char original = flag[i][j];
            for (char c : candidates) {
                if (c == original) continue;
                
                flag[i][j] = c;
                int new_local = 0;
                for (int dr = -1; dr <= 0; ++dr) {
                    for (int dc = -1; dc <= 0; ++dc) {
                        if (is_match(i + dr, j + dc)) {
                            new_local++;
                        }
                    }
                }
                
                long long current_gain = (long long)new_local - current_local;
                if (current_gain > max_gain) {
                    max_gain = current_gain;
                }
            }
            flag[i][j] = original;
        }
    }

    cout << initial_count + max_gain << endl;

    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...