문제 설명
어떤 문자열에서 연속한 위치에 있는 \(1\)개 이상의 문자를 선택해 순서를 유지한 채로 나열해서 얻을 수 있는
문자열을 그 문자열의 부분문자열이라 한다. 예를 들어, \(001\)는 \(X = 10011\)의 부분문자열이지만, \(Y = 10101\) 의 부분문자열은 아니다.
음이 아닌 두 정수 \(A, B\)의 배타적 논리합 \(A ⊕ B\)는 다음과 같이 정의된다
당신은 \(S\)의 부분문자열 \(s1, s2\)를 선택해서 만들 수 있는 \(g(s1, s2)\)의 최댓값을 계산해야 한다. \(g(s1, s2)\)는 다음과 같이 정의되는 함수이다:
\(0\)과 \(1\)로만 구성된 문자열 \(S\)가 주어지면, 가능한 \(g(s1, s2)\)의 최댓값을 구하는 프로그램을 작성하라.
제약 조건
• 주어지는 모든 수는 정수이다.
• \(1 \le T \le 100\)
• \(2 \le N \le 10^7\)
• 모든 테스트 케이스에서 \(N\)의 합 \(\le 10^7\)
• \(S\)는 \(0\)과 \(1\)로만 이루어진 길이가 \(N\)인 문자열이다.
부분문제
1. (17점) \(N \le 30\), 모든 테스트 케이스에서 \(N\)의 합 \(\le 300\)
2. (20점) \(N \le 200\), 모든 테스트 케이스에서 \(N\)의 합 \(\le 2000\)
3. (13점) \(N \le 3 000\), 모든 테스트 케이스에서 \(N\)의 합 \(\le 30 000\)
4. (12점) \(N \le 2 \times 10^5\) , 모든 테스트 케이스에서 \(N\)의 합 \(\le 2 \times 10^6\)
5. (38점) 추가 제약 조건 없음
음이 아닌 두 정수 \(A, B\)의 배타적 논리합 \(A ⊕ B\)는 다음과 같이 정의된다
- 이진법으로 생각했을 때, \(A\)의 \(2^k\)의 자릿수와 \(B\)의 \(2^k\)의 자릿수가 서로 다르면 \(A ⊕ B\)의 \(2^k\)의 자릿수가 \(1\)이고, 같으면 \(A ⊕ B\)의 \(2^k\)의 자릿수가 \(0\)이다. (단, \(k \ge 0\))
- 예를 들어 \(12 ⊕ 10\)은 \(12 = 1100_{(2)}, 10 = 1010_{(2)}\)이므로 \(1100_{(2)} ⊕ 1010_{(2)} = 0110_{(2)} = 6\)이다.
당신은 \(S\)의 부분문자열 \(s1, s2\)를 선택해서 만들 수 있는 \(g(s1, s2)\)의 최댓값을 계산해야 한다. \(g(s1, s2)\)는 다음과 같이 정의되는 함수이다:
- \(S\)의 부분문자열 \(s\)에 대해, \(f(s)\)의 값은 \(s\)를 이진법으로 해석했을 때의 값이다. 예를 들어, 만약 \(s = 11010\)이면 \(f(s) = 26\)이다.
- \(g(s1, s2)\)는 \(f(s1)\)과 \(f(s2)\)의 배타적 논리합이다.
\(0\)과 \(1\)로만 구성된 문자열 \(S\)가 주어지면, 가능한 \(g(s1, s2)\)의 최댓값을 구하는 프로그램을 작성하라.
제약 조건
• 주어지는 모든 수는 정수이다.
• \(1 \le T \le 100\)
• \(2 \le N \le 10^7\)
• 모든 테스트 케이스에서 \(N\)의 합 \(\le 10^7\)
• \(S\)는 \(0\)과 \(1\)로만 이루어진 길이가 \(N\)인 문자열이다.
부분문제
1. (17점) \(N \le 30\), 모든 테스트 케이스에서 \(N\)의 합 \(\le 300\)
2. (20점) \(N \le 200\), 모든 테스트 케이스에서 \(N\)의 합 \(\le 2000\)
3. (13점) \(N \le 3 000\), 모든 테스트 케이스에서 \(N\)의 합 \(\le 30 000\)
4. (12점) \(N \le 2 \times 10^5\) , 모든 테스트 케이스에서 \(N\)의 합 \(\le 2 \times 10^6\)
5. (38점) 추가 제약 조건 없음
입력 설명
첫 번째 줄에 테스트 케이스의 개수 \(T\)가 주어진다.
각 테스트 케이스마다, 첫 번째 줄에 문자열의 길이 \(N\), 두 번째 줄에 \(0\)과 \(1\)로만 구성된 길이가 \(N\)인 문자열 \(S\)가 주어진다.
각 테스트 케이스마다, 첫 번째 줄에 문자열의 길이 \(N\), 두 번째 줄에 \(0\)과 \(1\)로만 구성된 길이가 \(N\)인 문자열 \(S\)가 주어진다.
출력 설명
각 테스트 케이스마다 가능한 \(g(s1, s2)\)의 최댓값을 이진법으로 한 줄에 하나씩 출력한다. 단, 정답 앞에
필요 없는 \(0\)은 출력하지 않는다.
입력 예시 Copy
4
3
010
5
10101
5
00100
5
11111
출력 예시 Copy
11
11111
110
11110
도움
(중3, 고2)
첫 번째 테스트 케이스에서 \(s1 = 010, s2 = 01\)로 설정하면 \(g(s1, s2) = 11_{(2)}\)을 만들 수 있다. \(11_{(2)}\) 대신 \(011_{(2)}\)으로도 표현할 수 있지만, 정답 앞에 필요 없는 \(0\)을 출력하면 안 되므로 \(011\)이 아닌 \(11\)을 출력해야 한다.
네 번째 테스트 케이스에서 \(s1 = 11111, s2 = 1\)로 설정하면 \(g(s1, s2) = 11110_{(2)}\)을 만들 수 있다
첫 번째 테스트 케이스에서 \(s1 = 010, s2 = 01\)로 설정하면 \(g(s1, s2) = 11_{(2)}\)을 만들 수 있다. \(11_{(2)}\) 대신 \(011_{(2)}\)으로도 표현할 수 있지만, 정답 앞에 필요 없는 \(0\)을 출력하면 안 되므로 \(011\)이 아닌 \(11\)을 출력해야 한다.
네 번째 테스트 케이스에서 \(s1 = 11111, s2 = 1\)로 설정하면 \(g(s1, s2) = 11110_{(2)}\)을 만들 수 있다