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

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

균형 이진 문자열

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

요약
원형 이진 문자열에서 모든 '?'를 0 또는 1로 바꿀 때, 같은 길이의 임의의 두 원형 부분 문자열에 포함된 1의 개수가 많아야 1만큼 차이 나도록 만드는 경우의 수를 10^9+7로 나눈 나머지로 구한다.
난이도

어려움10점 중 8점

유형
문자열, 조합론, 수학, 구현
정답자
아직 제출이 없습니다

문제

Chiaki는 '0', '1', '?'로 이루어진 길이 nn의 문자열 ss를 가지고 있다.

s=s1s2…sns=s_1s_2 \dots s_n의 원형 부분 문자열 s(i,l)s(i,l)은 다음과 같은 문자열이다.

{sisi+1…si+l−1i+l−1≤nsisi+1…sns1s2…si+l−1−ni+l−1>n\begin{cases} s_i s_{i+1} \dots s_{i + l - 1} & i + l - 1 \le n \\ s_is_{i+1} \dots s_n s_1 s_2 \dots s_{i + l - 1 - n} & i + l - 1 > n \end{cases}

길이 nn의 이진 문자열 ss가 균형이라는 것은, 임의의 두 원형 부분 문자열 s(i,l)s(i,l)과 s(j,l)s(j,l) (1≤i,j,l≤n1 \le i, j, l \le n)에 대해 s(i,l)s(i,l)과 s(j,l)s(j,l)에 들어 있는 '1'의 개수가 많아야 1만큼 차이 나는 것을 말한다. 예를 들어 101101과 1101011011010110은 균형이지만, 11001100과 10101101101010110110은 균형이 아니다.

Chiaki는 자신의 문자열에서 모든 '?'를 '0' 또는 '1'로 바꾸어 문자열을 균형으로 만드는 방법의 수를 알고 싶어 한다. 이 수는 매우 클 수 있으므로 109+710^9+7로 나눈 나머지를 계산하면 된다.

입력

여러 개의 테스트 케이스가 주어진다. 입력의 첫 줄에는 테스트 케이스의 수를 나타내는 정수 TT가 주어진다. 각 테스트 케이스는 다음과 같다.

첫 줄에는 '0', '1', '?'로 이루어진 비어 있지 않은 문자열 ss가 주어진다. (1≤∣s∣≤10241 \le |s| \le 1024)

모든 테스트 케이스에서 ∣s∣|s|의 합은 10241024를 넘지 않는다.

출력

각 테스트 케이스마다 방법의 수를 나타내는 정수를 한 줄에 출력한다.

예제1

  1. 예제 1

    입력
    10
    ?
    ??
    ??1
    ???0
    ????1
    ?????0
    ??????1
    ???????0
    ????????1
    ?????????0
    
    예상 출력
    2
    4
    4
    6
    11
    11
    22
    22
    31
    32