만드는 중입니다

아직 만드는 중이라 바뀔 수 있습니다

이진 문자열

시간 제한4초메모리 제한2048 MB

요약
각 k에 대해 ?가 k칸 앞의 문자를 복사하고 앞쪽 ?는 0이 되는 규칙으로 만든 T_k의 1 개수를 구합니다.
난이도

보통10점 중 6점

유형
비트 연산, 문자열, 완전 탐색
정답자
아직 제출이 없습니다

문제

길이가 nn인 문자열 s1s2…sns_1 s_2 \ldots s_n이 주어진다. 각 문자는 0, 1, ? 중 하나이다.

모든 k∈[1,n]k \in [1, n]에 대해 문자열 Tk=t1t2…tnT_k = t_1 t_2 \ldots t_n을 다음과 같이 정의한다. 각 1≤i≤n1 \le i \le n에 대해 다음을 따른다.

  • si≠s_i \ne ?이면 ti=sit_i = s_i이다.
  • 그렇지 않고 i≤ki \le k이면 ti=t_i = 0이다.
  • 그 외에는 ti=ti−kt_i = t_{i-k}이다. ti−kt_{i-k}를 재귀적으로 계산해서 tit_i를 구할 수 있다.

TkT_k의 문자 집합은 01이다. 모든 k∈[1,n]k \in [1, n]에 대해 TkT_k에 있는 1의 개수를 구하라.

입력

첫째 줄에 문자열의 길이 nn (1≤n≤1051 \le n \le 10^5)이 주어진다.

둘째 줄에 길이 nn의 문자열 s1s2…sns_1 s_2 \ldots s_n이 주어진다. 각 문자는 0, 1, ? 중 하나이다.

출력

nn개의 줄을 출력한다. kk번째 줄에는 TkT_k에 있는 1의 개수를 출력한다.

예제1

  1. 예제 1

    입력
    5
    10?1?
    
    예상 출력
    3
    4
    2
    3
    2