아직 만들고 있는 페이지입니다.

이 페이지는 아직 만드는 중입니다. 보이는 내용은 바뀔 수 있습니다.

XOR 집합 확장

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

요약
초기 정수 집합에 원래 원소와의 XOR 결과를 더해 집합이 더 이상 커지지 않을 때까지 걸리는 확장 횟수를 구합니다.
난이도

보통10점 중 7점

유형
비트 연산, BFS, 수학
정답자
아직 제출이 없습니다

문제

숫자 집합 S0S_0가 주어진다. 아래 알고리즘은 새로운 값이 더 나오지 않을 때까지 집합을 넓히면서, 몇 번 넓혔는지 센다.

counter = 0
S = S0
loop:
    S' = { a xor b : a in S, b in S0, a != b }
    if every value of S' is already in S:
        print counter and stop
    S = S union S'
    counter = counter + 1
    goto loop

한 번의 반복에서는 이미 SS에 있는 값 하나와 처음 주어진 S0S_0의 값 하나를 XOR 한 결과를 모두 모아 S′S'을 만든다. 같은 값끼리는 짝으로 쓰지 않으므로 0은 SS에 들어가지 않는다. 새로운 값이 하나도 나오지 않는 반복에 이르면 그때의 counter를 출력하고 끝난다.

S0S_0 = {1, 2, 4}이면 알고리즘은 이렇게 돌아간다.

  • 시작 상태: counter = 0, S = {1, 2, 4}
  • 첫 번째 반복: S' = {3, 5, 6}, S = {1, 2, 3, 4, 5, 6}, counter = 1
  • 두 번째 반복: S' = {1, 2, 3, 4, 5, 6, 7}, S = {1, 2, 3, 4, 5, 6, 7}, counter = 2
  • 세 번째 반복: S' = {1, 2, 3, 4, 5, 6, 7}에 새로운 값이 없으므로 2를 출력하고 끝난다.

원소가 하나뿐인 집합은 XOR 할 짝이 없어 S′S'이 공집합이 되고, 답은 0이다.

S0S_0가 주어졌을 때 알고리즘이 출력하는 counter의 값을 구하는 프로그램을 작성하여라.

입력

첫 줄에 테스트 케이스의 수를 나타내는 양의 정수 TT가 주어진다. TT는 100,000 이하다.

각 테스트 케이스는 두 줄이다. 첫 줄에는 초기 집합 S0S_0의 크기 NN이 주어지고, NN은 1 이상 50 이하다. 둘째 줄에는 S0S_0의 원소 NN개가 공백으로 구분되어 주어진다. 모든 원소는 1 이상 500,000 이하의 정수이고 서로 다르다.

출력

각 테스트 케이스마다 한 줄에 Case #x: R 형식으로 출력한다. xx는 1부터 시작하는 테스트 케이스 번호이고, RR은 알고리즘이 출력하는 counter의 값이다.

예제1

  1. 예제 1

    입력
    10
    5
    9 16 17 21 20
    6
    15 18 27 6 21 7
    7
    9 25 22 10 12 34 33
    8
    27 22 5 15 25 13 8 31
    9
    19 4 15 25 21 18 9 22 20
    5
    33 34 37 36 24
    6
    4 15 6 14 8 16
    7
    16 27 41 19 10 26 20
    8
    16 20 13 11 12 3 24 6
    9
    24 6 44 35 22 1 26 21 17
    
    예상 출력
    Case #1: 2
    Case #2: 1
    Case #3: 2
    Case #4: 2
    Case #5: 2
    Case #6: 4
    Case #7: 3
    Case #8: 4
    Case #9: 2
    Case #10: 3