#define _CRT_SECURE_NO_WARNINGS #include #include #include #include #include #include using namespace std; int n, m; int a[1111][1111]; vector > pos[1000001]; int fx[1111], lx[1111], fy[1111], ly[1111]; vector BX; vector BY; int main(){ //freopen("input.txt", "r", stdin); //freopen("output.txt", "w", stdout); int T; for (cin >> T; T; T--){ cin >> n >> m; for (int i = 1; i <= n; i++){ for (int j = 1; j <= m; j++){ cin >> a[i][j]; pos[a[i][j]].push_back(make_pair(i, j)); } } int ans = 0; memset(lx, 0, sizeof(lx)); memset(ly, 0, sizeof(ly)); for (int pi = 1; pi <= n; pi++) for (int pj = 1; pj <= m; pj++) { int num = a[pi][pj]; if (pos[num].size() > 0){ int bestx = 0, besty = 0; BX.clear(); BY.clear(); for (int p = 0; p < pos[num].size(); p++){ int x = pos[num][p].first; int y = pos[num][p].second; // cout << " " << num << " " << x << " " << y << endl; if (lx[x] != num){ lx[x] = num; fx[x] = 0; } fx[x]++; if (fx[x] > bestx){ bestx = fx[x]; BX.clear(); } if (fx[x] == bestx){ BX.push_back(x); } if (ly[y] != num){ ly[y] = num; fy[y] = 0; } fy[y]++; if (fy[y] > besty){ besty = fy[y]; BY.clear(); } if (fy[y] == besty){ BY.push_back(y); } } int ok = 1; for (int i = 0; i < BX.size(); i++){ for (int j = 0; j < BY.size(); j++){ if (a[BX[i]][BY[j]] != num){ ok = 0; } if (ok == 0) break; } if (ok == 0) break; } ans = max(ans, bestx + besty - ok); pos[num].clear(); } } cout << ans << endl; } return 0; }