입력
터미널 피드의 첫 번째 줄에는 두 정수 $n$과 $k$ ($1 \le n, k \le 200$)가 주어지며, 이는 초기 코드의 개수와 각 코드의 길이를 나타냅니다.
다음 $n$개의 줄 각각에는 길이 $k$의 이진 문자열 (0과 1로 구성)이 주어지며, 현재 아카이브에 있는 코드를 나타냅니다.
마지막 줄에는 길이 $k$의 단일 이진 문자열 $t$가 주어지며, 이는 당신이 위조해야 할 표적 현상금 코드입니다.
출력
표적 코드 $t$를 위조하는 것이 불가능하다면, 한 줄에 NO를 출력합니다.
그렇지 않으면 YES를 출력합니다. 다음 줄에는 사용할 연산의 총 개수 $m$ ($0 \le m \le 10^5$)을 출력합니다. 그런 다음, $m$개의 줄에 연산을 순서대로 설명합니다:
1 x: 인덱스 $x$에 있는 기존 코드를 선택하여 위상 반전을 적용합니다 ($x$의 비트별 보수를 추가합니다);2 x y z: 인덱스 $x$, $y$, $z$에 있는 기존 코드를 선택하여 신호 삼각 측량을 적용합니다 ($x$, $y$, $z$ 인덱스를 가진 기존 문자열들의 $\operatorname{maj}$를 추가합니다).
사용하는 모든 인덱스는 사용하는 시점에 아카이브에 존재해야 합니다. 모든 $m$개의 연산을 마친 후, 아카이브 내 적어도 하나의 코드가 표적 $t$와 정확히 일치해야 합니다. 표적 코드 $t$가 시작 아카이브에 이미 있다면, $m = 0$을 출력하면 됩니다.
코드를 위조하는 올바른 방법이 여러 개라면, 그중 유효한 연산 수열 아무거나 출력해도 됩니다.
예제
입력 1
3 4 1000 0100 0010 1111
출력 1
YES 4 1 1 1 2 1 3 2 4 5 6
참고
- 처음 세 연산은 초기 문자열들의 보수를 추가하여
0111,1011,1101을 만듭니다. - 마지막 연산은 이 세 문자열의 비트별 다수결을 취합니다.
- 모든 위치에서 적어도 두 개의 비트가 $1$이므로, 추가된 문자열은
1111이 되며 이것이 표적입니다.