어떤 문자열에서 연속한 위치에 있는 1개 이상의 문자를 선택해 순서를 유지한 채로 나열해서 얻을 수 있는 문자열을 그 문자열의 부분문자열이라 한다. 예를 들어, 001는 X=10011의 부분문자열이지만, Y=10101의 부분문자열은 아니다.
음이 아닌 두 정수 A,B의 배타적 논리합 A⊕B는 다음과 같이 정의된다.
- 이진법으로 생각했을 때, A의 2k의 자릿수와 B의 2k의 자릿수가 서로 다르면 A⊕B의 2k의 자릿수가 1이고, 같으면 A⊕B의 2k의 자릿수가 0이다. (단, k≥0)
- 예를 들어 12⊕10은 12=1100(2),10=1010(2)이므로 1100(2)⊕1010(2)=0110(2)=6이다.
0과 1로만 구성된 길이가 N인 문자열 S가 주어진다.
당신은 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)의 배타적 논리합이다.
이때 s1과 s2가 서로 다를 필요는 없다. 즉, s1과 s2는 S에서 일부가 겹쳐도 되고, 완전히 같은 문자열이어도 된다.
0과 1로만 구성된 문자열 S가 주어지면, 가능한 g(s1,s2)의 최댓값을 구하는 프로그램을 작성하라.
Limit
- 주어지는 모든 수는 정수이다.
- 1≤T≤100
- 2≤N≤107
- 모든 테스트 케이스에서 N의 합 ≤107
- S는 0과 1로만 이루어진 길이가 N인 문자열이다.
Subtask
| 번호 | 배점 | 제한 |
|---|
| 1 | 17 | N≤30, 모든 테스트 케이스에서 N의 합 ≤300 |
| 2 | 20 | N≤200, 모든 테스트 케이스에서 N의 합 ≤2000 |
| 3 | 13 | N≤3000, 모든 테스트 케이스에서 N의 합 ≤30000 |
| 4 | 12 | N≤2×105, 모든 테스트 케이스에서 N의 합 ≤2×106 |
| 5 | 38 | 추가 제약 조건 없음. |
채점 및 기타 정보