만드는 중입니다

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

커플 파괴자 민욱이 (Large)

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

요약
커플이 서로 붙지 않도록 줄을 가장 적은 수의 연속된 그룹으로 나누고, 그룹을 다시 배열하는 방법을 최대 100개까지 구하는 문제입니다.
난이도

보통10점 중 7점

유형
동적 계획법, 백트래킹, 그리디
정답자
아직 제출이 없습니다

문제

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

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

입력

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

두 번째 줄에 각 사람의 정보를 나타내는 정수 a1,a2,a3,⋯ ,aNa_{1}, a_{2}, a_{3}, \cdots, a_{N} (0≤ai≤1030 \le a_{i} \le 10^{3})이 공백으로 구분되어 주어진다. aia_{i}는 대기 줄의 앞에서부터 ii번째에 서 있는 사람의 정보이다. ai=0a_{i} = 0이면 그 사람은 솔로이고, ai=aja_i = a_j이고 ai≠0a_i \ne 0이면 두 사람은 커플이다. 0이 아닌 수는 a1,a2,a3,⋯ ,aNa_{1}, a_{2}, a_{3}, \cdots, a_{N}에 반드시 두 번씩 존재한다.

출력

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

두 번째 줄부터 2×min⁡(C,100)+12 \times \min (C, 100) + 1번째 줄까지는 가능한 방법을 총 min⁡(C,100)\min (C, 100)가지 출력한다.

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

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

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

대기 줄을 몇 묶음으로 나누고 어떻게 배열하더라도 항상 한 커플 이상이 이웃한다면 첫 번째 줄에 −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