만드는 중입니다

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

팝카운트 단어

시간 제한1초메모리 제한1024 MB

요약
각 구간의 popcount 홀짝 비트열을 이어 붙인 문자열에서, 질의마다 주어진 0과 1의 패턴이 몇 번 나오는지 셉니다.
난이도

어려움10점 중 9점

유형
문자열 매칭, 비트 연산, 수학
정답자
아직 제출이 없습니다

문제

구간 [l,r][l,r]의 팝카운트 단어는 다음과 같이 정의한다. w(l,r)=slsl+1…sr−1srw(l,r)=s_ls_{l+1}\dots s_{r-1}s_{r} 여기서 si=popcount(i) mod 2s_i=\text{popcount}(i)\bmod 2이다. popcount(i)\text{popcount}(i)는 정수 ii를 이진수로 표현했을 때 나타나는 1의 개수다.

nn개의 구간 [l1,r1],[l2,r2],…,[ln,rn][l_1,r_1],[l_2,r_2],\dots,[l_n,r_n]이 주어진다. 문자열 S=w(l1,r1)+w(l2,r2)+⋯+w(ln,rn)S=w(l_1,r_1)+w(l_2,r_2)+\dots+w(l_n,r_n)을 만든다. 여기서 ++는 이어 붙이기를 뜻한다.

qq개의 질의가 주어진다. ii번째 질의에서는 비트 패턴 pip_i가 주어진다. pip_i가 SS의 부분 문자열로 몇 번 나타나는지 구한다. 출현이 서로 겹쳐도 각각 센다.

입력

첫 줄에 정수 nn과 qq(1≤n,q≤100 0001 \leq n,q \leq 100\,000)가 주어진다. 다음 nn개 줄에는 ii번째 구간을 나타내는 정수 lil_i와 rir_i(1≤li≤ri≤1091\leq l_i\leq r_i\leq 10^9)가 한 줄에 하나씩 주어진다. 다음 qq개 줄에는 비어 있지 않은 문자열 pip_i가 주어지며, '0'과 '1'로만 이루어진다. 모든 패턴 길이의 합은 최대 500 000500\,000이다.

입력에는 테스트 케이스가 하나만 주어진다.

출력

각 질의마다 패턴이 SS에 나타나는 횟수를 한 줄에 하나씩 출력한다.

힌트

w(l1,r1)=w(2,6)=w(l_1,r_1)=w(2,6)= 10100, w(l2,r2)=w(1,3)=w(l_2,r_2)=w(1,3)= 110, w(l3,r3)=w(4,8)=w(l_3,r_3)=w(4,8)= 10011.

S=w(l1,r1)+w(l2,r2)+w(l3,r3)=S=w(l_1,r_1)+w(l_2,r_2)+w(l_3,r_3)= 1010011010011

예제1

  1. 예제 1

    입력
    3 5
    2 6
    1 3
    4 8
    0
    1
    11
    101
    0011010
    
    예상 출력
    6
    7
    2
    2
    1