커플 파괴자 민욱이 (Large)

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

요약
줄을 가장 적은 수의 연속 묶음으로 나눈 뒤 묶음 순서를 바꾸어 어떤 커플도 이웃하지 않게 하고, 가능한 방법을 최대 100가지 출력한다.
난이도

어려움10점 중 8점

유형
그리디, 동적 계획법, 구현
정답자
아직 제출이 없습니다

문제

'커플 파괴자 민욱이'는 솔로이기 때문에 커플끼리 함께 있는 모습을 보기 싫어한다. 그러한 민욱이가 사람들 NN명이 일렬로 서 있는 대기 줄 하나를 발견했다. 민욱이는 이 대기 줄을 MM개의 묶음으로 나눈 뒤, 묶음의 순서를 바꾸어 어떠한 커플끼리도 이웃하지 않게 할 것이다. 각 묶음의 사람 수는 일정하지 않고 서로 달라도 된다. 단, 같은 묶음에 있는 사람들끼리의 순서를 바꾸거나 거꾸로 뒤집을 수는 없다.

MM이 크다면 묶음의 순서를 바꾸는 민욱이의 머리가 아플 것이기 때문에 MM이 최소가 되게 하려고 한다. 그리고 민욱이는 MM이 최소일 때의 가능한 방법의 개수를 CC라고 할 때, 가능한 여러 가지 방법 중 아무거나 min⁡(C,100)\min (C, 100)가지를 구하려고 한다. 각 묶음의 사람 수가 모두 같더라도 묶음을 배열하는 순서가 다르다면 다른 방법으로 치고, 묶음을 배열하는 순서가 같더라도 각 묶음의 사람 수가 하나라도 다르다면 다른 방법으로 친다.

입력

11번째 줄에 사람들의 수를 나타내는 정수 N(1≤N≤103)N(1 \le N \le 10^{3})이 주어진다.

22번째 줄에 각 사람의 정보를 나타내는 정수 a_1,a_2,a_3,⋯ ,a_Na\_{1}, a\_{2}, a\_{3}, \cdots, a\_{N} (0≤a_i≤103)(0 \le a\_{i} \le 10^{3})이 공백으로 구분되어 주어진다. a_ia\_{i}는 대기 줄의 앞에서부터 ii번째에 서 있는 사람의 정보를 나타낸다. a_i=0a\_{i} = 0이라면 그 사람이 솔로임을, a_i=a_ja\_i = a\_j이고 a_i≠0a\_i \ne 0이라면 두 사람이 커플임을 의미한다. 00이 아닌 수가 a_1,a_2,a_3,⋯ ,a_Na\_{1}, a\_{2}, a\_{3}, \cdots, a\_{N}에 존재한다면 그 수는 무조건 두 번 존재한다.

출력

각 묶음의 번호를 대기 줄의 앞에서부터 1,2,3,⋯ ,M1, 2, 3, \cdots, M이라고 매길 때,

11번째 줄에는 MM의 최솟값을 출력한다.

그리고 22번째 줄부터 2×min⁡(C,100)+12 \times \min (C, 100) + 1번째 줄까지는 아래의 형식에 맞춰 가능한 방법을 총 min⁡(C,100)\min (C, 100)가지 출력한다.

2k2k번째 줄에는 kk번째 방법에서 11번 묶음, 22번 묶음, 33번 묶음, ⋯\cdots, MM번 묶음의 사람 수를 공백으로 구분하여 출력한다.

2k+12k + 1번째 줄에는 kk번째 방법에서 묶음의 순서를 바꿨을 때 대기 줄의 앞에서부터 묶음의 번호를 출력한다.

만약 CC의 값이 100100보다 작은 경우에는 2C+22C + 2번째 줄에 −1-1을 출력하고 그다음 줄부터는 아무것도 출력하지 않는다.

만약 대기 줄을 몇 묶음으로 나누고 어떻게 배열하더라도 항상 한 커플 이상이 이웃한다면 11번째 줄에 −1-1을 출력하고 그다음 줄부터는 아무것도 출력하지 않는다.

예제2

  1. 예제 1

    입력
    6
    3 1 1 3 2 2
    
    예상 출력
    3
    2 3 1
    1 3 2
    2 3 1
    2 1 3
    2 3 1
    3 2 1
    -1
    
  2. 예제 2

    입력
    4
    0 0 0 0
    
    예상 출력
    1
    4
    1
    -1