좋은 행렬과 운이 좋은 행렬
시간 제한2초메모리 제한1024 MB
주어진 n x n 이진 행렬을 반대 유형의 행렬과 일대일로 대응시키는 전단사 함수를 구성합니다.
문제
정사각 이진 행렬은 행렬식이 홀수이면 좋은 행렬이라고 한다.
크기의 이진 행렬은 아래 탐욕 매칭 알고리즘이 크기 의 매칭을 찾으면 운이 좋은 행렬이라고 한다. 알고리즘은 행렬을 위에서 아래로 한 줄씩 읽는다. 각 줄에서 이전에 한 번도 선택되지 않은 열에 1이 있으면, 그중 가장 왼쪽 열을 고른다.
크기의 좋은 행렬과 운이 좋은 행렬의 개수를 비교해야 한다. 이를 위해 작은 집합과, 큰 집합의 같은 크기 부분집합 사이의 전단사 함수를 만들어야 한다.
입력
첫 줄에 테스트 케이스의 수 가 주어진다. 이어서 테스트 케이스가 주어진다.
각 테스트 케이스의 첫 줄에는 행렬의 종류를 나타내는 문자열 good 또는 lucky가 주어진다. 다음 줄에는 행렬의 크기 ()이 주어진다. 이어서 개의 줄이 주어지며, 번째 줄은 길이가 정확히 인 이진 문자열로 행렬의 번째 행이다.
두 번째 실행에서 주어지는 행렬은 첫 번째 실행에서 프로그램이 출력한 행렬과 완전히 같으며, 같은 순서로 주어진다. 모든 테스트 케이스의 의 합은 2000을 넘지 않는다.
출력
실행할 때마다 개의 답을 출력한다. 각 답은 한 줄에 정수 만 쓰거나, 입력 형식과 비슷하게 반대 종류의 행렬을 출력한다. 즉 한 줄에 을 쓰고, 이어서 개의 줄로 행을 출력한다.
대응은 전단사여야 한다. 첫 번째 실행에서 종류가 같은 행렬 에 대한 답이 행렬 였고, 두 번째 실행에서 에 대한 답이 행렬 였다면 가 성립해야 한다. 각 과 행렬 종류에 대해 를 그 종류의 모든 행렬의 집합, 를 반대 종류의 모든 행렬의 집합이라 하자. 에 속한 서로 다른 행렬 중 로 답할 수 있는 것은 최대 개다.