적당히 좋은 비율 (큰 입력)

시간 제한5초메모리 제한512 MB

요약
0과 1로 이루어진 문자열과 목표 비율 F가 주어질 때 1의 비율이 F에 가장 가까운 부분 문자열 중 시작 위치가 가장 작은 값을 구합니다.
난이도

보통10점 중 7점

유형
누적 합, 정렬
정답자
아직 제출이 없습니다

문제

NN개의 이진 숫자로 이루어진 문자열이 하나 있다. 1의 비율이 원하는 값과 정확히 같은 부분 문자열을 찾고 싶지만 그런 부분 문자열이 없을 수도 있으니, 가장 가까운 것으로 만족하려고 한다.

소수 FF가 주어질 때, 1의 비율이 FF에 가장 가까운 부분 문자열을 찾아라. 부분 문자열의 1의 비율은 그 안에 들어 있는 1의 개수를 길이로 나눈 값이다. 부분 문자열은 연속한 문자로 이루어지고 길이는 1 이상이다. 가장 가까운 부분 문자열 중 시작 위치가 가장 앞인 것의 위치를 구하여라.

입력

첫 줄에 테스트 케이스의 수 TT가 주어진다. 이어서 TT개의 테스트 케이스가 주어진다.

각 테스트 케이스의 첫 줄에는 NN과 FF가 공백 하나로 구분되어 주어진다. FF는 0 이상 1 이하의 소수이고 소수점 아래가 정확히 6자리다. 다음 줄에는 0 또는 1인 숫자 NN개가 공백 없이 이어져 주어진다.

제한

  • 1≤T≤1001 \le T \le 100
  • 0≤F≤10 \le F \le 1
  • FF의 소수점 아래는 정확히 6자리다
  • 1≤N≤5000001 \le N \le 500000

출력

각 테스트 케이스마다 Case #x: y 형식으로 한 줄씩 출력한다. xx는 1부터 시작하는 테스트 케이스 번호이고, yy는 1의 비율이 FF에 가장 가까운 부분 문자열의 시작 위치다. 위치는 0부터 센다. 가능한 위치가 여러 개면 그중 가장 작은 값을 출력한다.

설명

F=0.666667F = 0.666667이고 문자열이 001001010111인 경우를 보자. 1의 비율이 정확히 666667/1000000666667/1000000인 부분 문자열은 없고, 가장 가까운 값은 2/32/3이다. 이 값에 도달하는 부분 문자열은 5개다. 길이가 3이고 위치 5, 7, 8에서 시작하는 101, 101, 011, 그리고 길이가 6이고 위치 5, 6에서 시작하는 101011, 010111이다. 이 중 시작 위치가 가장 작은 값은 5다.

예제2

  1. 예제 1

    입력
    5
    12 0.666667
    001001010111
    11 0.400000
    10000100011
    9 0.000000
    111110111
    5 1.000000
    00000
    15 0.333333
    000000000011000
    
    예상 출력
    Case #1: 5
    Case #2: 5
    Case #3: 5
    Case #4: 0
    Case #5: 6
    
  2. 예제 2

    입력
    3
    2 0.500000
    01
    2 0.500000
    10
    3 0.500000
    110
    
    예상 출력
    Case #1: 0
    Case #2: 0
    Case #3: 1