만드는 중입니다

아직 만드는 중이라 바뀔 수 있습니다

좋은 행렬과 운이 좋은 행렬

시간 제한2초메모리 제한1024 MB

요약
주어진 n x n 이진 행렬을 반대 유형의 행렬과 일대일로 대응시키는 전단사 함수를 구성합니다.
난이도

어려움10점 중 10점

유형
조합론, 수학, 행렬
정답자
아직 제출이 없습니다

문제

정사각 이진 행렬은 행렬식이 홀수이면 좋은 행렬이라고 한다.

n×nn \times n 크기의 이진 행렬은 아래 탐욕 매칭 알고리즘이 크기 nn의 매칭을 찾으면 운이 좋은 행렬이라고 한다. 알고리즘은 행렬을 위에서 아래로 한 줄씩 읽는다. 각 줄에서 이전에 한 번도 선택되지 않은 열에 1이 있으면, 그중 가장 왼쪽 열을 고른다.

n×nn \times n 크기의 좋은 행렬과 운이 좋은 행렬의 개수를 비교해야 한다. 이를 위해 작은 집합과, 큰 집합의 같은 크기 부분집합 사이의 전단사 함수를 만들어야 한다.

입력

첫 줄에 테스트 케이스의 수 tt가 주어진다. 이어서 테스트 케이스가 주어진다.

각 테스트 케이스의 첫 줄에는 행렬의 종류를 나타내는 문자열 good 또는 lucky가 주어진다. 다음 줄에는 행렬의 크기 nn (1≤n≤20001 \leq n \leq 2000)이 주어진다. 이어서 nn개의 줄이 주어지며, ii번째 줄은 길이가 정확히 nn인 이진 문자열로 행렬의 ii번째 행이다.

두 번째 실행에서 주어지는 행렬은 첫 번째 실행에서 프로그램이 출력한 행렬과 완전히 같으며, 같은 순서로 주어진다. 모든 테스트 케이스의 nn의 합은 2000을 넘지 않는다.

출력

실행할 때마다 tt개의 답을 출력한다. 각 답은 한 줄에 정수 −1-1만 쓰거나, 입력 형식과 비슷하게 반대 종류의 행렬을 출력한다. 즉 한 줄에 nn을 쓰고, 이어서 nn개의 줄로 행을 출력한다.

대응은 전단사여야 한다. 첫 번째 실행에서 종류가 같은 행렬 AA에 대한 답이 행렬 BB였고, 두 번째 실행에서 BB에 대한 답이 행렬 CC였다면 A=CA = C가 성립해야 한다. 각 nn과 행렬 종류에 대해 UU를 그 종류의 모든 n×nn \times n 행렬의 집합, VV를 반대 종류의 모든 n×nn \times n 행렬의 집합이라 하자. UU에 속한 서로 다른 행렬 중 −1-1로 답할 수 있는 것은 최대 max⁡(∣U∣−∣V∣,0)\max(|U| - |V|, 0)개다.

예제2

  1. 예제 1

    입력
    3
    lucky
    2
    11
    11
    good
    2
    11
    01
    lucky
    2
    01
    10
    
    예상 출력
    2
    11
    10
    2
    11
    01
    2
    01
    10
    
  2. 예제 2

    입력
    3
    good
    2
    11
    10
    lucky
    2
    11
    01
    good
    2
    01
    10
    
    예상 출력
    2
    11
    11
    2
    11
    01
    2
    01
    10