Problem:
B: Hokkaido University Hard

注意

　問題設定は A 問題と同一のものですが、制約のみが異なりますのでご注意ください。

物語

　北海道大学に合格し、新たな生活の始まりに心を躍らせるほむらちゃん。しかし彼女の前には、とてつもなく広いキャンパスが待ち受けていた...。

　「え...次の授業に間に合わないんだけど...」

問題

　北海道大学札幌キャンパスは異常に広いことで有名です。札幌キャンパスは縦に H マス、横に W マス並んだ長方形のマス目で表現されます。北から i マス、西から j マス進んだマスを (i,j) で表すことにします。キャンパス内にはいくつか建物があり、マス (i,j) で表される位置に建物がある場合は 'B' 、ない場合は '.' が c_{i,j} に書かれています。

　北海道大学の新入生のほむらちゃんは、キャンパスのあまりの広さに驚愕し、建物間の移動が心配になってきました。そこで、建物のある 2 つのマスのうち、最も遠い組はどれくらい離れているのかが気になりました。ここで、2 つのマスの組 (i,j) , (i',j') の間の距離を |i-i'|+|j-j'| と定義します。

　ほむらちゃんは、自分にはこの問題は難しいと思い、同級生のあなたに助けを求めてきました。ほむらちゃんの代わりに答えを求めてください。

入力形式

H W
c_{11}c_{12} ... c_{1W}
:
c_{H1}c_{H2} ... c_{HW}

制約

2 \leq H,W \leq 10^3

H,W は整数

c_{i,j} は 'B' か '.' のいずれかである。

c_{i,j} のうち少なくとも 2 つは 'B' である。

出力形式

答えを表す整数を 1 行に出力せよ。

入力例 1

3 3
B.B
..B
.BB

出力例 1

4

(1,1) と (3,3) の 2 点間が最長です。

入力例 2

4 3
B..
B..
...
...

出力例 2

1

隣り合う位置が最長になる場合もあります。

入力例 3

6 6
...B..
B.B.B.
.B.B.B
...B.B
.B..B.
..B...

出力例 3

7

Solution in C++14 (judge verdict: Accepted)

#include <iostream>
#include <vector>
#include <algorithm>
#include <utility>
#include <cmath>
using namespace std;
vector<int> v[1010];
vector<pair<int,int>> u;
int main(){
	int i,j,h,w;
	cin >> h >> w;
	for(i=0;i<h;i++){
		for(j=0;j<w;j++){
			char c; cin >> c;
			if(c=='B'){
				v[i].push_back(j);
			}
		}
	}
	for(i=0;i<h;i++){
		sort(v[i].begin(),v[i].end());
	}
	for(i=0;i<h;i++){
		if(v[i].size()>=1){
			u.push_back({i,v[i][0]});
			u.push_back({i,v[i].back()});
		}
	}
	int mx = 0;
	for(i=0;i<u.size();i++){
		for(j=0;j<u.size();j++){
			mx = max(mx,abs(u[i].first - u[j].first) + abs(u[i].second - u[j].second));
		}
	}
	cout << mx << endl;
}