이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <iostream>
#include <queue>
#include <vector>
#include <map>
using namespace std;
 
vector<vector<int>> a;
char mat[4001][4001];
map<pair<int, int>, int> mp;
bool viz[16000001];
queue<pair<int, int>> Q;
 
#define fast ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
 
int n, m;
int l;
int Max;
 
const int di[] = {-1, 0, 1, 0};
const int dj[] = {0, 1, 0, -1}; 
 
bool inside(int i, int j) {
    if (i >= 1 && i <= n && j >= 1 && j <= m)
        return 1;
    return 0;
}
 
void dfs1(int i, int j) {
    int k, inou, jnou;
    mp[{i, j}] = l;
    for (k = 0; k < 4; k++) {
        inou = i + di[k], jnou = j + dj[k];
        if (inside(inou, jnou) && mp.find({inou, jnou}) == mp.end() && mat[inou][jnou] == mat[i][j])
            dfs1(inou, jnou);
    }
}
 
void dfs2(int i, int j) {
    int k, inou, jnou, comp1, comp2;
    viz[(i - 1) * m + j] = 1;
    for (k = 0; k < 4; k++) {
        inou = i + di[k], jnou = j + dj[k];
        comp1 = mp[{i, j}], comp2 = mp[{inou, jnou}];
        if (inside(inou, jnou) && !viz[(inou - 1) * m + jnou] && mat[inou][jnou] == mat[i][j])
            dfs2(inou, jnou);
        else if (inside(inou, jnou) && !viz[(inou - 1) * m + jnou] && mat[inou][jnou] != '.' && (a[comp1].size() == 0 || a[comp1].back() != comp2)) {
            a[comp1].emplace_back(comp2);
            a[comp2].emplace_back(comp1);
        }
    }
}
 
void bfs(int x) {
    int i;
    pair<int, int> p;
    Q.push({x, 1});
    viz[x] = 1;
    while (!Q.empty()) {
        p = Q.front();
        Q.pop();
        if (p.second > Max)
            Max = p.second;
        for (int y : a[p.first]) {
            if (!viz[y]) {
                viz[y] = 1;
                Q.push({y, p.second + 1});
            }
        }   
    }
}
 
int main() {
    fast
    int i, j;
    cin >> n >> m;
    for (i = 1; i <= n; i++)
        for (j = 1; j <= m; j++)
            cin >> mat[i][j];
    for (i = 1; i <= n; i++)
        for (j = 1; j <= m; j++)
            if (mp.find({i, j}) == mp.end() && mat[i][j] != '.') {
                l++;
                dfs1(i, j);
            }
    a.resize(l + 1);
    for (i = 1; i <= n; i++)
        for (j = 1; j <= m; j++)
            if (!viz[(i - 1) * m + j] && mat[i][j] != '.') 
                dfs2(i, j);
    for (i = 1; i <= l; i++)
        viz[i] = 0;
    bfs(1);
    cout << Max;
    return 0;
}
컴파일 시 표준 에러 (stderr) 메시지
tracks.cpp: In function 'void bfs(int)':
tracks.cpp:54:9: warning: unused variable 'i' [-Wunused-variable]
   54 |     int i;
      |         ^| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... |