아레나레이팅

2023 신촌지역 대학생 프로그래밍 대회 동아리 연합 여름 대회 (SUAPC 2023 Summer) Open Contest

우선 집합 AA에 들어가는 수에 11, 집합 BB에 들어가는 수에 00을 부여해서 두 집합의 상태를 bool string으로 표현해봅시다. 예를 들어, 집합 AA1,3,4,5,61, 3, 4, 5, 6이 있고, 집합 BB22가 있다면 이를 101111101111로 표현할 수 있습니다.

그러면 이제 집합에서 연속한 수들을 옮기는 작업이 string에서는 110001110 \rightarrow 001 또는 011100011 \rightarrow 100으로 바꾸는 연산과 동일합니다.

이러한 연산의 형태는 Peg Solitaire 퍼즐로 잘 알려져 있고, 일반적인 이 퍼즐은 2차원의 작은 십자가 보드에서 진행됩니다.

이 문제는 1차원 보드에서 진행되는 Peg Solitaire 퍼즐로 해석할 수 있고, 이 퍼즐에서 해결 가능한(11을 하나만 남길 수 있는) 초기 형태는 대략 8가지의 정규식(regular expression)으로 표현할 수 있습니다. (참고: arXiv:math/0008172) 이는 역연산(100011100 \rightarrow 011 또는 001110001 \rightarrow 110)을 통해 유도가 가능하다는 정도로 간략히 말씀드리겠습니다.

해결 가능한 1차원 Peg Solitaire 퍼즐의 초기 형태 정규식 중 연속한 0이 없는 형태는 다음과 같습니다.

문제를 다시 보면 1차원 Peg Solitaire 퍼즐에서 길이 NN00의 개수 MM이 주어졌을 때, 해결 가능한 초기 형태 중 00이 연속하지 않는 것을 출력하는 문제로 볼 수 있습니다.

다시 정규식으로 돌아가서 우선 길이 NN이 5 이상일 때, "양 끝이 11이고" 해결 가능한 string은 NN이 짝수일 때만 가능함을 알 수 있습니다. 그렇기 때문에 NN이 홀수라면 무조건 첫 자리 또는 마지막 자리를 00으로 둬야 합니다. 편의상 첫 자리를 00으로 두겠습니다.

그래서 정규식 중 /10(11)*(10)*11/를 사용하여, NN이 홀수일 때는 /010(11)*(10)*11/, 짝수일 때는 /10(11)*(10)*11/가 정답이 됩니다. 단, NN이 홀수일 때 MM이 1이라면 위 정규식에선 00이 최소 두 개 필요했기 때문에 정답이 될 수 없습니다. 그래서 이 경우는 -1을 출력하고, 나머지는 각 정규식에서 00의 index를 전부 출력해주면 AC를 받을 수 있습니다.