#include <bits/stdc++.h>
using namespace std;
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 [r, c] = q.front();
q.pop();
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() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
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> comp_size;
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 sz = bfs(i, j, graph, vis, comp_id,
comp, delrow, delcol, m, n);
comp_size[comp++] = sz;
}
int ans = 0;
// evaluate each row
for (int i = 0; i < m; ++i) {
unordered_set<int> st;
int x=0;
for (int j = 0; j < n; ++j) {
if (graph[i][j] == '#') st.insert(comp_id[i][j]);
if (i - 1 >= 0) st.insert(comp_id[i-1][j]);
if (i + 1 < m) st.insert(comp_id[i+1][j]);
if(graph[i][j]=='.') x++;
}
int cur = 0;
for (int id : st) cur += comp_size[id];
ans = max(ans, cur+x);
}
// evaluate each column
for (int j = 0; j < n; ++j) {
unordered_set<int> st;
int x=0;
for (int i = 0; i < m; ++i) {
if (graph[i][j] == '#') st.insert(comp_id[i][j]);
if (j - 1 >= 0) st.insert(comp_id[i][j-1]);
if (j + 1 < n) st.insert(comp_id[i][j+1]);
if(graph[i][j]=='.') x++;
}
int cur = 0;
for (int id : st) cur += comp_size[id];
ans = max(ans, cur+x);
}
cout << ans << '\n';
}
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgppbnQgYmZzKGludCByb3csIGludCBjb2wsCiAgICAgICAgdmVjdG9yPHZlY3RvcjxjaGFyPj4mIGdyYXBoLAogICAgICAgIHZlY3Rvcjx2ZWN0b3I8aW50Pj4mIHZpcywKICAgICAgICB2ZWN0b3I8dmVjdG9yPGludD4+JiBjb21wX2lkLCAgIAogICAgICAgIGludCBjb21wLAogICAgICAgIGludCBkZWxyb3dbXSwgaW50IGRlbGNvbFtdLAogICAgICAgIGludCBtLCBpbnQgbikKewogICAgcXVldWU8cGFpcjxpbnQsaW50Pj4gcTsKICAgIHEucHVzaCh7cm93LGNvbH0pOwogICAgdmlzW3Jvd11bY29sXSA9IDE7CiAgICBpbnQgc2l6ZSA9IDA7CgogICAgd2hpbGUgKCFxLmVtcHR5KCkpIHsKICAgICAgICBhdXRvIFtyLCBjXSA9IHEuZnJvbnQoKTsKICAgICAgICBxLnBvcCgpOwogICAgICAgIHNpemUrKzsKICAgICAgICBjb21wX2lkW3JdW2NdID0gY29tcDsgICAgICAgICAgCgogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNDsgKytpKSB7CiAgICAgICAgICAgIGludCBuciA9IHIgKyBkZWxyb3dbaV07CiAgICAgICAgICAgIGludCBuYyA9IGMgKyBkZWxjb2xbaV07CiAgICAgICAgICAgIGlmIChuciA+PSAwICYmIG5yIDwgbSAmJiBuYyA+PSAwICYmIG5jIDwgbgogICAgICAgICAgICAgICAgJiYgZ3JhcGhbbnJdW25jXSA9PSAnIycKICAgICAgICAgICAgICAgICYmICF2aXNbbnJdW25jXSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcS5wdXNoKHtuciwgbmN9KTsKICAgICAgICAgICAgICAgIHZpc1tucl1bbmNdID0gMTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBzaXplOwp9CgppbnQgbWFpbigpIHsKICAgIGlvczo6c3luY193aXRoX3N0ZGlvKGZhbHNlKTsKICAgIGNpbi50aWUobnVsbHB0cik7CgogICAgaW50IHQ7CiAgICBjaW4gPj4gdDsKICAgIHdoaWxlICh0LS0pIHsKICAgICAgICBpbnQgbSwgbjsKICAgICAgICBjaW4gPj4gbSA+PiBuOwoKICAgICAgICB2ZWN0b3I8dmVjdG9yPGNoYXI+PiBncmFwaChtLCB2ZWN0b3I8Y2hhcj4obikpOwogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbTsgKytpKQogICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IG47ICsraikKICAgICAgICAgICAgICAgIGNpbiA+PiBncmFwaFtpXVtqXTsKCiAgICAgICAgaW50IGRlbHJvd1tdID0gey0xLCAwLCAxLCAwfTsKICAgICAgICBpbnQgZGVsY29sW10gPSB7IDAsLTEsIDAsIDF9OwoKICAgICAgICB2ZWN0b3I8dmVjdG9yPGludD4+IHZpcyhtLCB2ZWN0b3I8aW50PihuLCAwKSk7CiAgICAgICAgdmVjdG9yPHZlY3RvcjxpbnQ+PiBjb21wX2lkKG0sIHZlY3RvcjxpbnQ+KG4sIDApKTsKICAgICAgICB1bm9yZGVyZWRfbWFwPGludCxpbnQ+IGNvbXBfc2l6ZTsKCiAgICAgICAgaW50IGNvbXAgPSAxOwogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbTsgKytpKQogICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IG47ICsraikKICAgICAgICAgICAgICAgIGlmIChncmFwaFtpXVtqXSA9PSAnIycgJiYgIXZpc1tpXVtqXSkgewogICAgICAgICAgICAgICAgICAgIGludCBzeiA9IGJmcyhpLCBqLCBncmFwaCwgdmlzLCBjb21wX2lkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wLCBkZWxyb3csIGRlbGNvbCwgbSwgbik7CiAgICAgICAgICAgICAgICAgICAgY29tcF9zaXplW2NvbXArK10gPSBzejsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgaW50IGFucyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKCiAgICAgICAgLy8gZXZhbHVhdGUgZWFjaCByb3cKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG07ICsraSkgewogICAgICAgICAgICB1bm9yZGVyZWRfc2V0PGludD4gc3Q7CiAgICAgICAgICAgIGludCB4PTA7CiAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgbjsgKytqKSB7CiAgICAgICAgICAgICAgICBpZiAoZ3JhcGhbaV1bal0gPT0gJyMnKSBzdC5pbnNlcnQoY29tcF9pZFtpXVtqXSk7CiAgICAgICAgICAgICAgICBpZiAoaSAtIDEgPj0gMCkgICAgICAgIHN0Lmluc2VydChjb21wX2lkW2ktMV1bal0pOwogICAgICAgICAgICAgICAgaWYgKGkgKyAxIDwgIG0pICAgICAgICBzdC5pbnNlcnQoY29tcF9pZFtpKzFdW2pdKTsKICAgICAgICAgICAgICAgIGlmKGdyYXBoW2ldW2pdPT0nLicpIHgrKzsKICAgICAgICAgICAgfQogICAgICAgICAgICBpbnQgY3VyID0gMDsKICAgICAgICAgICAgZm9yIChpbnQgaWQgOiBzdCkgY3VyICs9IGNvbXBfc2l6ZVtpZF07CiAgICAgICAgICAgIGFucyA9IG1heChhbnMsIGN1cit4KTsKICAgICAgICB9CgogICAgICAgIC8vIGV2YWx1YXRlIGVhY2ggY29sdW1uCiAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBuOyArK2opIHsKICAgICAgICAgICAgdW5vcmRlcmVkX3NldDxpbnQ+IHN0OwogICAgICAgICAgICBpbnQgeD0wOwogICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG07ICsraSkgewogICAgICAgICAgICAgICAgaWYgKGdyYXBoW2ldW2pdID09ICcjJykgc3QuaW5zZXJ0KGNvbXBfaWRbaV1bal0pOwogICAgICAgICAgICAgICAgaWYgKGogLSAxID49IDApICAgICAgICBzdC5pbnNlcnQoY29tcF9pZFtpXVtqLTFdKTsKICAgICAgICAgICAgICAgIGlmIChqICsgMSA8ICBuKSAgICAgICAgc3QuaW5zZXJ0KGNvbXBfaWRbaV1baisxXSk7CiAgICAgICAgICAgICAgICBpZihncmFwaFtpXVtqXT09Jy4nKSB4Kys7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaW50IGN1ciA9IDA7CiAgICAgICAgICAgIGZvciAoaW50IGlkIDogc3QpIGN1ciArPSBjb21wX3NpemVbaWRdOwogICAgICAgICAgICBhbnMgPSBtYXgoYW5zLCBjdXIreCk7CiAgICAgICAgfQogICAgICAgIGNvdXQgPDwgYW5zIDw8ICdcbic7CiAgICB9CiAgICByZXR1cm4gMDsKfQo=