Use this to learn the idea, then write your own version.
1package main2 3import (4 "bufio"5 . "fmt"6 "io"7)8 910func cf1985H2(in io.Reader, _w io.Writer) {11 out := bufio.NewWriter(_w)12 defer out.Flush()13 dir4 := []struct{ x, y int }{{-1, 0}, {1, 0}, {0, -1}, {0, 1}}14 var T, n, m, minX, minY, maxX, maxY, sz int15 for Fscan(in, &T); T > 0; T-- {16 Fscan(in, &n, &m)17 a := make([][]byte, n)18 for i := range a {19 Fscan(in, &a[i])20 }21 var dfs func(int, int)22 dfs = func(i, j int) {23 minX = min(minX, i)24 maxX = max(maxX, i)25 minY = min(minY, j)26 maxY = max(maxY, j)27 sz++28 a[i][j] = 029 for _, d := range dir4 {30 x, y := i+d.x, j+d.y31 if 0 <= x && x < n && 0 <= y && y < m && a[x][y] == '#' {32 dfs(x, y)33 }34 }35 }36 cr := make([]int, n)37 cc := make([]int, m)38 dr := make([]int, n+2)39 dc := make([]int, m+2)40 d2 := make([][]int, n+3)41 for i := range d2 {42 d2[i] = make([]int, m+3)43 }44 update := func(r1, c1, r2, c2, val int) {45 d2[r1+1][c1+1] += val46 d2[r1+1][c2+2] -= val47 d2[r2+2][c1+1] -= val48 d2[r2+2][c2+2] += val49 }50 for i, row := range a {51 for j, b := range row {52 if b == '#' {53 minX, minY, maxX, maxY, sz = n, m, 0, 0, 054 dfs(i, j)55 minX = max(minX-1, 0)56 minY = max(minY-1, 0)57 dr[minX] += sz58 dr[maxX+2] -= sz59 dc[minY] += sz60 dc[maxY+2] -= sz61 update(minX, minY, maxX+1, maxY+1, sz)62 } else if b == '.' {63 cr[i]++64 cc[j]++65 }66 }67 }68 for i := 1; i < n; i++ {69 dr[i] += dr[i-1]70 }71 for j := 1; j < m; j++ {72 dc[j] += dc[j-1]73 }74 ans := 075 for i, row := range a {76 for j, b := range row {77 d2[i+1][j+1] += d2[i+1][j] + d2[i][j+1] - d2[i][j]78 res := cr[i] + cc[j] + dr[i] + dc[j] - d2[i+1][j+1]79 if b == '.' {80 res--81 }82 ans = max(ans, res)83 }84 }85 Fprintln(out, ans)86 }87}88 8990