#include <bits/stdc++.h>
using namespace std;
// 🛠️ Fix 1: pass comp_id by reference!
int bfs(int row, int col, vector<vector<char>> &graph, vector<vector<int>> &vis,
vector<vector<int>> &comp_id, int comp, int delrow[], int delcol[], int m, int n) {
queue<pair<int, int>> q;
q.push({row, col});
vis[row][col] = 1;
int size = 0;
while (!q.empty()) {
auto it = q.front();
q.pop();
int r = it.first;
int c = it.second;
size++;
comp_id[r][c] = comp;
for (int i = 0; i < 4; i++) {
int nr = r + delrow[i];
int nc = c + delcol[i];
if (nr >= 0 && nr < m && nc >= 0 && nc < n && graph[nr][nc] == '#' && !vis[nr][nc]) {
q.push({nr, nc});
vis[nr][nc] = 1;
}
}
}
return size;
}
int main() {
int t;
cin >> t;
while (t--) {
int m, n;
cin >> m >> n;
vector<vector<char>> graph(m, vector<char>(n));
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
cin >> graph[i][j];
}
}
int delrow[] = {-1, 0, 1, 0};
int delcol[] = {0, -1, 0, 1};
vector<vector<int>> vis(m, vector<int>(n, 0));
vector<vector<int>> comp_id(m, vector<int>(n, 0));
unordered_map<int, int> mp;
int comp = 1;
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (graph[i][j] == '#' && !vis[i][j]) {
int size = bfs(i, j, graph, vis, comp_id, comp, delrow, delcol, m, n);
mp[comp] = size;
comp++;
}
}
}
int ans = 0;
// 🔧 Fix 2: Use correct direction arrays (delrow/delcol)
// setting the rows
for (int i = 0; i < m; i++) {
unordered_set<int> st;
for (int j = 0; j < n; j++) {
if (graph[i][j] == '#') continue;
for (int x = 0; x < 4; x++) {
int nrow = i + delrow[x]; // ✅ Corrected
int ncol = j + delcol[x]; // ✅ Corrected
if (nrow >= 0 && nrow < m && ncol >= 0 && ncol < n && graph[nrow][ncol] == '#') {
st.insert(comp_id[nrow][ncol]);
}
}
}
int count_size = 0;
for (auto &it : st) {
count_size += mp[it];
}
ans = max(ans, count_size);
}
// setting the columns
for (int j = 0; j < n; j++) {
unordered_set<int> st;
for (int i = 0; i < m; i++) {
if (graph[i][j] == '#') continue;
for (int x = 0; x < 4; x++) {
int nrow = i + delrow[x]; // ✅ Corrected
int ncol = j + delcol[x]; // ✅ Corrected
if (nrow >= 0 && nrow < m && ncol >= 0 && ncol < n && graph[nrow][ncol] == '#') {
st.insert(comp_id[nrow][ncol]);
}
}
}
int count_size = 0;
for (auto &it : st) {
count_size += mp[it];
}
ans = max(ans, count_size);
}
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (graph[i][j] == '#') {
ans = max(ans, mp[comp_id[i][j]]);
}
}
}
cout << ans << endl;
}
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgovLyDwn5ug77iPIEZpeCAxOiBwYXNzIGNvbXBfaWQgYnkgcmVmZXJlbmNlIQppbnQgYmZzKGludCByb3csIGludCBjb2wsIHZlY3Rvcjx2ZWN0b3I8Y2hhcj4+ICZncmFwaCwgdmVjdG9yPHZlY3RvcjxpbnQ+PiAmdmlzLAogICAgICAgIHZlY3Rvcjx2ZWN0b3I8aW50Pj4gJmNvbXBfaWQsIGludCBjb21wLCBpbnQgZGVscm93W10sIGludCBkZWxjb2xbXSwgaW50IG0sIGludCBuKSB7CgogICAgcXVldWU8cGFpcjxpbnQsIGludD4+IHE7CiAgICBxLnB1c2goe3JvdywgY29sfSk7CiAgICB2aXNbcm93XVtjb2xdID0gMTsKICAgIGludCBzaXplID0gMDsKCiAgICB3aGlsZSAoIXEuZW1wdHkoKSkgewogICAgICAgIGF1dG8gaXQgPSBxLmZyb250KCk7CiAgICAgICAgcS5wb3AoKTsKICAgICAgICBpbnQgciA9IGl0LmZpcnN0OwogICAgICAgIGludCBjID0gaXQuc2Vjb25kOwogICAgICAgIHNpemUrKzsKICAgICAgICBjb21wX2lkW3JdW2NdID0gY29tcDsKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkrKykgewogICAgICAgICAgICBpbnQgbnIgPSByICsgZGVscm93W2ldOwogICAgICAgICAgICBpbnQgbmMgPSBjICsgZGVsY29sW2ldOwogICAgICAgICAgICBpZiAobnIgPj0gMCAmJiBuciA8IG0gJiYgbmMgPj0gMCAmJiBuYyA8IG4gJiYgZ3JhcGhbbnJdW25jXSA9PSAnIycgJiYgIXZpc1tucl1bbmNdKSB7CiAgICAgICAgICAgICAgICBxLnB1c2goe25yLCBuY30pOwogICAgICAgICAgICAgICAgdmlzW25yXVtuY10gPSAxOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIHNpemU7Cn0KCmludCBtYWluKCkgewogICAgaW50IHQ7CiAgICBjaW4gPj4gdDsKICAgIHdoaWxlICh0LS0pIHsKICAgICAgICBpbnQgbSwgbjsKICAgICAgICBjaW4gPj4gbSA+PiBuOwogICAgICAgIHZlY3Rvcjx2ZWN0b3I8Y2hhcj4+IGdyYXBoKG0sIHZlY3RvcjxjaGFyPihuKSk7CiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtOyBpKyspIHsKICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBuOyBqKyspIHsKICAgICAgICAgICAgICAgIGNpbiA+PiBncmFwaFtpXVtqXTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaW50IGRlbHJvd1tdID0gey0xLCAwLCAxLCAwfTsKICAgICAgICBpbnQgZGVsY29sW10gPSB7MCwgLTEsIDAsIDF9OwoKICAgICAgICB2ZWN0b3I8dmVjdG9yPGludD4+IHZpcyhtLCB2ZWN0b3I8aW50PihuLCAwKSk7CiAgICAgICAgdmVjdG9yPHZlY3RvcjxpbnQ+PiBjb21wX2lkKG0sIHZlY3RvcjxpbnQ+KG4sIDApKTsKICAgICAgICB1bm9yZGVyZWRfbWFwPGludCwgaW50PiBtcDsKICAgICAgICBpbnQgY29tcCA9IDE7CgogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbTsgaSsrKSB7CiAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgbjsgaisrKSB7CiAgICAgICAgICAgICAgICBpZiAoZ3JhcGhbaV1bal0gPT0gJyMnICYmICF2aXNbaV1bal0pIHsKICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZSA9IGJmcyhpLCBqLCBncmFwaCwgdmlzLCBjb21wX2lkLCBjb21wLCBkZWxyb3csIGRlbGNvbCwgbSwgbik7CiAgICAgICAgICAgICAgICAgICAgbXBbY29tcF0gPSBzaXplOwogICAgICAgICAgICAgICAgICAgIGNvbXArKzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaW50IGFucyA9IDA7CgogICAgICAgIC8vIPCflKcgRml4IDI6IFVzZSBjb3JyZWN0IGRpcmVjdGlvbiBhcnJheXMgKGRlbHJvdy9kZWxjb2wpCiAgICAgICAgLy8gc2V0dGluZyB0aGUgcm93cwogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbTsgaSsrKSB7CiAgICAgICAgICAgIHVub3JkZXJlZF9zZXQ8aW50PiBzdDsKICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBuOyBqKyspIHsKICAgICAgICAgICAgICAgIGlmIChncmFwaFtpXVtqXSA9PSAnIycpIGNvbnRpbnVlOwoKICAgICAgICAgICAgICAgIGZvciAoaW50IHggPSAwOyB4IDwgNDsgeCsrKSB7CiAgICAgICAgICAgICAgICAgICAgaW50IG5yb3cgPSBpICsgZGVscm93W3hdOyAgLy8g4pyFIENvcnJlY3RlZAogICAgICAgICAgICAgICAgICAgIGludCBuY29sID0gaiArIGRlbGNvbFt4XTsgIC8vIOKchSBDb3JyZWN0ZWQKICAgICAgICAgICAgICAgICAgICBpZiAobnJvdyA+PSAwICYmIG5yb3cgPCBtICYmIG5jb2wgPj0gMCAmJiBuY29sIDwgbiAmJiBncmFwaFtucm93XVtuY29sXSA9PSAnIycpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3QuaW5zZXJ0KGNvbXBfaWRbbnJvd11bbmNvbF0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpbnQgY291bnRfc2l6ZSA9IDA7CiAgICAgICAgICAgIGZvciAoYXV0byAmaXQgOiBzdCkgewogICAgICAgICAgICAgICAgY291bnRfc2l6ZSArPSBtcFtpdF07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYW5zID0gbWF4KGFucywgY291bnRfc2l6ZSk7CiAgICAgICAgfQoKICAgICAgICAvLyBzZXR0aW5nIHRoZSBjb2x1bW5zCiAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBuOyBqKyspIHsKICAgICAgICAgICAgdW5vcmRlcmVkX3NldDxpbnQ+IHN0OwogICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG07IGkrKykgewogICAgICAgICAgICAgICAgaWYgKGdyYXBoW2ldW2pdID09ICcjJykgY29udGludWU7CgogICAgICAgICAgICAgICAgZm9yIChpbnQgeCA9IDA7IHggPCA0OyB4KyspIHsKICAgICAgICAgICAgICAgICAgICBpbnQgbnJvdyA9IGkgKyBkZWxyb3dbeF07ICAvLyDinIUgQ29ycmVjdGVkCiAgICAgICAgICAgICAgICAgICAgaW50IG5jb2wgPSBqICsgZGVsY29sW3hdOyAgLy8g4pyFIENvcnJlY3RlZAogICAgICAgICAgICAgICAgICAgIGlmIChucm93ID49IDAgJiYgbnJvdyA8IG0gJiYgbmNvbCA+PSAwICYmIG5jb2wgPCBuICYmIGdyYXBoW25yb3ddW25jb2xdID09ICcjJykgewogICAgICAgICAgICAgICAgICAgICAgICBzdC5pbnNlcnQoY29tcF9pZFtucm93XVtuY29sXSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGludCBjb3VudF9zaXplID0gMDsKICAgICAgICAgICAgZm9yIChhdXRvICZpdCA6IHN0KSB7CiAgICAgICAgICAgICAgICBjb3VudF9zaXplICs9IG1wW2l0XTsKICAgICAgICAgICAgfQogICAgICAgICAgICBhbnMgPSBtYXgoYW5zLCBjb3VudF9zaXplKTsKICAgICAgICB9CgogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbTsgaSsrKSB7CiAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgbjsgaisrKSB7CiAgICAgICAgICAgICAgICBpZiAoZ3JhcGhbaV1bal0gPT0gJyMnKSB7CiAgICAgICAgICAgICAgICAgICAgYW5zID0gbWF4KGFucywgbXBbY29tcF9pZFtpXVtqXV0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBjb3V0IDw8IGFucyA8PCBlbmRsOwogICAgfQogICAgcmV0dXJuIDA7Cn0K