Problem:
長方形探索

縦に H 行、横に W 列並べられた、合計 W × H のマス目があります。いくつかのマス目には印がついています。各マス目の印の状態を読み込み、印のついていないマス目だけからなる最大の長方形の面積を出力するプログラムを作成してください。

入力データは 1 行 W 文字から構成され、H 行が与えられます。たとえば以下のようなデータが与えられます。

..*....**.
..........
**....***.
....*.....
..*.......
...**.....
.*.*......
..........
..**......
.*..*.....

入力データの一行が、一行のマス目を表現します。入力データの文字列のうち、. (ピリオド) は印のついていないマス目、* (アスタリスク) は印のついているマス目を示しています。入力データの文字列には、ピリオド、アスタリスク、改行以外の文字は含まれません。

上記の例では、下図の 0 で示される長方形が最大となります。

..*....**.
..........
**....***.
....*00000
..*..00000
...**00000
.*.*.00000
.....00000
..**.00000
.*..*00000

よって、35 と出力すれば正解になります。なお、すべてのマス目に印がついている場合には、0 を出力してください。

Input

複数のデータセットが与えられます。各データセットはスペースで区切られた H と W からなる行から始まり、つづいて H × W の長方形が与えられます。H, W はともに 500　以下とします。

入力は２つの 0 を含む行で終わります。データセットの数は 20 を超えません。

Output

各データセットごとに、最大の長方形の面積を１行に出力してください。

Sample Input

10 10
...*....**
..........
**....**..
........*.
..*.......
**........
.*........
..........
....*..***
.*....*...
10 10
..*....*..
.*.*...*..
*****..*..
*...*..*..
*...*..*..
..........
****.*...*
..*..*...*
.*...*...*
****..***.
2 3
...
...
0 0

Output for the Sample Input

28
12
6

Solution in Ruby (judge verdict: Time Limit Exceeded)

# Time exceeding.

def count_rect(rect_map, line, index, h)
  li = line.index('.')
  return 0 if !li

  count_max = 0
  current_h = index

  while li < 10
    ri = li
    ri += 1 while line[ri + 1] == '.'

    if $star_count_max < (ri-li+1) * (index-h+1).abs
      (li..ri).to_a.combination(2).sort.each do |set|
        count = 0
        _li, _ri = set
        _ri = _li if _ri.nil?
        while rect_map[current_h][_li.._ri].all?{ |x| x == '.' }
          count += _ri - _li + 1
          current_h += 1
          break if h <= current_h
        end
        count_max = count if count_max < count
        current_h = index
      end
    end
    li = ri + 1
    li += 1 while line[li] != '.' && li <= 10
  end

  count_max
end

loop do
  $star_count_max = 0
  h, w = gets.chomp.split.map(&:to_i)
  break if [h, w].all?(&:zero?)

  star_map = Array.new
  h.times { star_map << gets.chomp.split('') }

  star_map.each.with_index do |l, i|
    temp = count_rect(star_map, l, i, h)
    $star_count_max = temp if $star_count_max < temp
  end
  puts $star_count_max
end