Use this to learn the idea, then write your own version.
1package main2 3import (4 "bufio"5 "bytes"6 . "fmt"7 "io"8)9 1011 1213func CF370D(_r io.Reader, _w io.Writer) {14 in := bufio.NewReader(_r)15 out := bufio.NewWriter(_w)16 defer out.Flush()17 min := func(a, b int) int {18 if a < b {19 return a20 }21 return b22 }23 max := func(a, b int) int {24 if a > b {25 return a26 }27 return b28 }29 30 var n, m int31 Fscan(in, &n, &m)32 a := make([][]byte, n)33 for i := range a {34 Fscan(in, &a[i])35 }36 draw := func(x, y, sz int) {37 for i := x; i <= x+sz; i++ {38 for j := y; j <= y+sz; {39 if a[i][j] == '.' {40 a[i][j] = '+'41 }42 if i == x || i == x+sz {43 j++44 } else {45 j += sz46 }47 }48 }49 }50 transpose := func() {51 n, m := len(a), len(a[0])52 b := make([][]byte, m)53 for i := range b {54 b[i] = make([]byte, n)55 for j, r := range a {56 b[i][j] = r[i]57 }58 }59 a = b60 }61 62 var f func()63 f = func() {64 n, m := len(a), len(a[0])65 i0, i1 := -1, 066 j0, j1 := m, 067 for i, row := range a {68 l, r := bytes.IndexByte(row, 'w'), bytes.LastIndexByte(row, 'w')69 if l < 0 {70 continue71 }72 if i0 < 0 {73 i0 = i74 }75 i1 = i76 j0 = min(j0, l)77 j1 = max(j1, r)78 }79 sz := max(i1-i0, j1-j0)80 if sz == 0 {81 return82 }83 if sz >= min(n, m) {84 a = nil85 return86 }87 if sz == i1-i0 {88 col := make([]bool, m)89 for _, r := range a[i0+1 : i1] {90 for j, b := range r {91 if b == 'w' {92 col[j] = true93 }94 }95 }96 pos := []int{}97 for j, b := range col {98 if b {99 pos = append(pos, j)100 }101 }102 if len(pos) == 0 {103 draw(i0, max(j1-sz, 0), sz)104 } else if len(pos) == 1 {105 if pos[0] <= j0 {106 if pos[0]+sz < m {107 draw(i0, pos[0], sz)108 return109 }110 }111 if pos[0] >= j1 {112 if l := pos[0] - sz; l >= 0 {113 draw(i0, l, sz)114 return115 }116 }117 a = nil118 } else if len(pos) == 2 {119 if pos[0] > j0 || pos[1] < j1 || pos[1]-pos[0] != sz {120 a = nil121 return122 }123 draw(i0, pos[0], sz)124 } else {125 a = nil126 }127 } else {128 transpose()129 f()130 if a != nil {131 transpose()132 }133 }134 }135 f()136 if a == nil {137 Fprint(out, -1)138 return139 }140 for _, r := range a {141 Fprintln(out, string(r))142 }143}144 145146