땅 팔기

시간 제한1초메모리 제한128 MB

요약
격자의 각 칸을 사각형의 남동쪽 모서리로 볼 때, 그 칸에서 끝나는 모두 잔디인 사각형의 최대 둘레를 구하고 둘레별 개수를 출력하는 문제입니다.
난이도

어려움10점 중 8점

유형
동적 계획법, 배열, 행렬
정답자
아직 제출이 없습니다

문제

어떤 나라의 영토는 단위 정사각형들로 나뉘어 있으며, 각 칸은 잔디 또는 늪이다. 담당 관청은 직사각형이 아닌 모양을 처리하지 못하기 때문에, 땅은 격자에 맞춰진 직사각형 블록 단위로만 살 수 있다. 관청은 곱셈을 하지 못해 넓이 대신 둘레로 값을 매기므로, 한 블록의 가격은 그 블록의 둘레와 같다.

Per는 직사각형 모양의 땅 한 필지를 가지고 있으며, 이를 여러 개의 (서로 겹쳐도 되는) 조각으로 나누어 팔려고 한다. 직사각형 블록을 팔 때 관청은 그 블록의 남동쪽(오른쪽 아래) 모서리 좌표만 기록한다. 이미 같은 남동쪽 모서리를 가진 블록이 팔린 적이 있으면 관청은 그 거래를 거절한다. 그 외에는 블록이 서로 겹쳐도 되므로, Per는 서로 다른 남동쪽 모서리마다 블록을 하나씩 팔 수 있다. 늪 칸을 포함한 블록은 아무도 사지 않으므로, 파는 모든 블록은 전부 잔디로만 이루어져야 한다.

Per는 돈을 최대한 많이 벌기 위해, 가능한 각 남동쪽 모서리마다 그 모서리를 오른쪽 아래 꼭짓점으로 하면서 전부 잔디로 이루어진 직사각형 블록 중 둘레가 가장 큰 것을 판다. 예를 들어 가로 22, 세로 44인 블록의 둘레는 2×(2+4)=122\times(2+4)=12이다. 그가 파는 모든 블록에 대해, 각 둘레의 블록을 몇 개씩 파는지 구하여라.

입력

첫 줄에 테스트 케이스의 수 TT (1≤T≤1001 \le T \le 100)가 주어진다. 각 테스트 케이스는 다음과 같이 주어진다.

  • 한 줄에 두 정수 nn과 mm (1≤n,m≤10001 \le n, m \le 1000): Per가 가진 필지의 행 수와 열 수.
  • 이어서 nn개의 줄이 주어지며, 각 줄은 mm개의 문자로 이루어진다. 각 문자는 #(늪) 또는 .(잔디)이다. ii번째 행, jj번째 열의 문자는 위치 (i,j)(i, j)의 칸을 나타내며, 필지의 북서쪽 모서리는 (1,1)(1, 1), 남동쪽 모서리는 (n,m)(n, m)이다.

출력

각 테스트 케이스마다, 최적의 계획에서 각 둘레의 블록을 몇 개씩 파는지 나타내는 0개 이상의 줄을 출력한다. 둘레가 ii인 블록을 pip_i개 판다면, count x perimeter 형식으로 한 줄을 출력한다(개수, 공백, 문자 x, 공백, 그리고 둘레). 줄은 둘레 ii가 증가하는 순서로 정렬하고, 같은 ii를 가진 줄을 두 번 출력하지 않으며, pi=0p_i = 0인 둘레는 출력하지 않는다.

예제3

  1. 예제 1

    입력
    1
    6 5
    ..#.#
    .#...
    #..##
    ...#.
    #....
    #..#.
    
    예상 출력
    6 x 4
    5 x 6
    5 x 8
    3 x 10
    1 x 12
    
  2. 예제 2

    입력
    1
    1 1
    .
    
    예상 출력
    1 x 4
    
  3. 예제 3

    입력
    1
    1 5
    .....
    
    예상 출력
    1 x 4
    1 x 6
    1 x 8
    1 x 10
    1 x 12