Problem:


Score : 400 points

Problem Statement

There is a grid with H horizontal rows and W vertical columns, and there are obstacles on some of the squares.

Snuke is going to choose one of the squares not occupied by an obstacle and place a lamp on it.
The lamp placed on the square will emit straight beams of light in four cardinal directions: up, down, left, and right.
In each direction, the beam will continue traveling until it hits a square occupied by an obstacle or it hits the border of the grid. It will light all the squares on the way, including the square on which the lamp is placed, but not the square occupied by an obstacle.

Snuke wants to maximize the number of squares lighted by the lamp.

You are given H strings S_i (1 \leq i \leq H), each of length W. If the j-th character (1 \leq j \leq W) of S_i is #, there is an obstacle on the square at the i-th row from the top and the j-th column from the left; if that character is ., there is no obstacle on that square.

Find the maximum possible number of squares lighted by the lamp.

Constraints

1 \leq H \leq 2,000

1 \leq W \leq 2,000

S_i is a string of length W consisting of # and ..

. occurs at least once in one of the strings S_i (1 \leq i \leq H).

Input

Input is given from Standard Input in the following format:

H W
S_1
:
S_H

Output

Print the maximum possible number of squares lighted by the lamp.

Sample Input 1

4 6
#..#..
.....#
....#.
#.#...

Sample Output 1

8

If Snuke places the lamp on the square at the second row from the top and the second column from the left, it will light the following squares: the first through fifth squares from the left in the second row, and the first through fourth squares from the top in the second column, for a total of eight squares.

Sample Input 2

8 8
..#...#.
....#...
##......
..###..#
...#..#.
##....#.
#...#...
###.#..#

Sample Output 2

13



Sample input:
4 6
#..#..
.....#
....#.
#.#...


Sample output:
8

Submission status: Accepted

Solution code:
import subprocess
import gzip, base64, os
import stat

gz = b'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'
bin = gzip.decompress(base64.b64decode(gz))
p = os.path.dirname(__file__)
pymain = os.path.join(p, "pymain")
with open(pymain, "wb") as f:
    f.write(bin)
os.chmod(pymain, stat.S_IRUSR | stat.S_IWUSR | stat.S_IXUSR)
if p == "":
    pymain = "./" + pymain
cmd = pymain
subprocess.call(cmd.split())

Submission status: Accepted

Solution code:
import numpy as np
H , W = list(map(int, input().split()))
S = np.array([list(input().rstrip()) for _ in range(H)]) == '.'
U = np.zeros((H, W), dtype=int)
D = np.zeros((H, W), dtype=int)
R = np.zeros((H, W), dtype=int)
L = np.zeros((H, W), dtype=int)
for h in range(1, H):
    U[h] = (U[h - 1] + 1) * S[h - 1]
for h in reversed(range(H - 1)):
    D[h] = (D[h + 1] + 1) * S[h + 1]
for w in range(1, W):
    L[:, w] = (L[:, w - 1] + 1) * S[:, w - 1]
for w in reversed(range(W - 1)):
    R[:, w] = (R[:, w + 1] + 1) * S[:, w + 1]
print(np.max((U+D+L+R) * S) + 1)

Submission status: Accepted

Solution code:
def slove():
    import sys
    input = sys.stdin.readline
    h, w = map(int, input().split())
    lst = []
    for i in range(h):
        lst.append(list(input()))

    R = [[0] * w for _ in range(h)]
    L = [[0] * w for _ in range(h)]
    U = [[0] * w for _ in range(h)]
    D = [[0] * w for _ in range(h)]

    for i in range(h):
        for j in range(w):
            if lst[i][j] == '.':
                if j == 0:
                    L[i][j] = 1
                else:
                    L[i][j] = L[i][j - 1] + 1

    for i in range(h):
        for j in range(w - 1, -1, -1):
            if lst[i][j] == '.':
                if j == w - 1:
                    R[i][j] = 1
                else:
                    R[i][j] = R[i][j + 1] + 1

    for i in range(h):
        for j in range(w):
            if lst[i][j] == '.':
                if i == 0:
                    U[i][j] = 1
                else:
                    U[i][j] = U[i - 1][j] + 1

    for i in range(h - 1, -1, -1):
        for j in range(w):
            if lst[i][j] == '.':
                if i == h - 1:
                    D[i][j] = 1
                else:
                    D[i][j] = D[i + 1][j] + 1

    ans = 0
    x = [[0] * w for _ in range(h)]
    for i in range(h):
        for j in range(w):
            x[i][j] = L[i][j] + R[i][j] + U[i][j] + D[i][j] - 3
        ans = max(ans, max(x[i]))
    print(ans)


if __name__ == '__main__':
    slove()

Submission status: Accepted

Solution code:
h, w = map(int, input().split())

m = []
for i in range(h):
    row = list(input())
    m.append(row)

res = 0

mem = [[] for i in range(h)]
dummy = (-1, -1)

for i in range(h):
    _mem = mem[i]
    for j in range(w):
        a = m[i][j]

        if a == "#":
            _mem.append(dummy)
            continue

        c_cnt = 0
        r_cnt = 0

        above = mem[i - 1][j] if i > 0 else dummy
        if above == dummy:
            for ii in range(i + 1, h):
                if m[ii][j] == "#":
                    break
                c_cnt += 1
        else:
            c_cnt = above[0]

        left = mem[i][j - 1] if j > 0 else dummy
        if left == dummy:
            for jj in range(j + 1, w):
                if m[i][jj] == "#":
                    break
                r_cnt += 1
        else:
            r_cnt = left[1]

        res = max(res, c_cnt + r_cnt + 1)
        _mem.append((c_cnt, r_cnt))

print(res)

Submission status: Accepted

Solution code:
import numpy as np
h,w = map(int,input().split())
s = np.array([[1 if i == "." else 0 for i in input()] for j in range(h)])
l,r,u,d = np.zeros((h,w)),np.zeros((h,w)),np.zeros((h,w)),np.zeros((h,w))
for i in range(h):
  u[i] = (u[i-1]+1)*s[i]
  d[-i-1] = (d[-i]+1)*s[-i-1]
for i in range(w):
  l[:,i] = (l[:,i-1]+1)*s[:,i]
  r[:,-i-1] = (r[:,-i]+1)*s[:,-i-1]
print(int(np.max(l+r+u+d))-3)

Submission status: Accepted

Solution code:
import numpy as np
h,w=map(int,input().split())
a=np.array([[0 if i!="." else 1 for i in input()]for j in range(h)])
s,t,u,p=np.zeros((h,w)),np.zeros((h,w)),np.zeros((h,w)),np.zeros((h,w))
for i in range(h):
    s[i]=(s[i-1]+1)*a[i]
    t[-i-1]=(t[-i]+1)*a[-i-1]
for i in range(w):
    u[:,i]=(u[:,i-1]+1)*a[:,i]
    p[:,-i-1]=(p[:,-i]+1)*a[:,-i-1]
print(int(np.max(s+t+u+p))-3)

Submission status: Accepted

Solution code:
H, W = map(int, input().split())
grid = [input() for i in range(H)]
tate = [[-1]*W for i in range(H)]
yoko = [[-1]*W for i in range(H)]

def calc(x,y):
    if grid[y][x] == '#':
        return
    if tate[y][x] == -1:
        count = 1
        up = y
        down = y
        while True:
            if up == 0 or grid[up-1][x] == '#':
                break
            else:
                up -= 1
                count += 1
        while True:
            if down == H-1 or grid[down+1][x] == '#':
                break
            else:
                down += 1
                count += 1
        for i in range(up, down+1):
            tate[i][x] = count
    if yoko[y][x] == -1:
        count = 1
        left = x
        right = x
        while True:
            if left == 0 or grid[y][left-1] == '#':
                break
            else:
                left -= 1
                count += 1
        while True:
            if right == W-1 or grid[y][right+1] == '#':
                break
            else:
                right += 1
                count += 1
        for i in range(left, right+1):
            yoko[y][i] = count
    return

for x in range(W):
    for y in range(H):
        calc(x, y)

ans = 0
for x in range(W):
    for y in range(H):
       ans = max(ans, tate[y][x]+yoko[y][x]-1)
print(ans)

Submission status: Accepted

Solution code:
from sys import stdin
def main():
  from builtins import range
  readline = stdin.readline
  h, w = map(int, readline().split())
  s = [readline().rstrip('\r\n') + '#' for _ in range(h)]
  s.append('#' * w)
  ft = [[i] * i for i in range(10)]
  yoko = [[0] * w for _ in range(h)]
  for i in range(h):
    start = -1
    si = s[i]
    yokoi = yoko[i]
    for j in range(w + 1):
      if si[j] == '#':
        if start != -1:
          t = j - start
          if t < 10:
            yokoi[start:j] = ft[t]
          else:
            yokoi[start:j] = [t] * t
          start = -1
      else:
        if start == -1:
          start = j
  result = 0
  for i in range(w):
    start = -1
    for j in range(h + 1):
      if s[j][i] == '#':
        if start != -1:
          t = yoko_max + j - start - 1
          if t > result:
            result = t
          start = -1
      else:
        yji = yoko[j][i]
        if start == -1:
          start = j
          yoko_max = yji
        else:
          if yji > yoko_max:
            yoko_max = yji
  print(result)
main()

Submission status: Accepted

Solution code:
from sys import stdin
def main():
  from builtins import range
  readline = stdin.readline
  h, w = map(int, readline().split())
  s = [readline().rstrip('\r\n') + '#' for _ in range(h)]
  s.append('#' * w)
  ft = [[i] * i for i in range(1000)]
  yoko = [[0] * w for _ in range(h)]
  for i in range(h):
    start = -1
    si = s[i]
    yokoi = yoko[i]
    for j in range(w + 1):
      if si[j] == '#':
        if start != -1:
          t = j - start
          if t < 1000:
            yokoi[start:j] = ft[t]
          else:
            yokoi[start:j] = [t] * t
          start = -1
      else:
        if start == -1:
          start = j
  result = 0
  for i in range(w):
    start = -1
    for j in range(h + 1):
      if s[j][i] == '#':
        if start != -1:
          t = yoko_max + j - start - 1
          if t > result:
            result = t
          start = -1
      else:
        yji = yoko[j][i]
        if start == -1:
          start = j
          yoko_max = yji
        else:
          if yji > yoko_max:
            yoko_max = yji
  print(result)
main()