만드는 중입니다

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

해리 포터와 회문 반지름

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

요약
각 위치의 회문 반지름이 주어졌을 때, 이 값을 만드는 0과 1로 된 문자열을 모두 찾아 사전순으로 출력합니다.
난이도

보통10점 중 7점

유형
문자열 매칭, 문자열, 구현
정답자
아직 제출이 없습니다

해리 포터와 회문 반지름

젊은 마법사 해리 포터에게 슬픈 소식이 전해졌다. 가문의 가장 큰 어른인 마르쿠스 래디우스 팔린드로머스 블랙 삼촌이 세상을 떠났다. 마르쿠스 삼촌은 복잡한 이진 마법을 쓰는 괴짜로 알려져 있었고, 아주 큰 부자이기도 했다.

블랙의 유언장에는 해리가 그의 신비한 보물 방을 물려받는다고 적혀 있다. 그러나 방에 들어가 보물을 차지하려면 올바른 암호 HH를 말해야 한다. HH는 0과 1로만 이루어진 길이 nn의 문자열이다. 마르쿠스 삼촌은 암호를 해리에게 알려 주지 않았다. 대신 x=1,2,…,nx = 1, 2, \ldots, n 각각에 대해 회문 반지름 pxp_x를 계산했다. pxp_x는 H[x]H[x]를 가운데 두고 길이가 2px+12p_x + 1인 구간 H[x−px..x+px]H[x - p_x .. x + p_x]가 존재하고 회문이 되는 가장 큰 정수이다. 해리가 받은 것은 p1,…,pnp_1, \ldots, p_n 값뿐이다. 예를 들어 암호가 10111010이면 해리는 (0,1,0,3,0,1,1,0)(0, 1, 0, 3, 0, 1, 1, 0)을 받는다.

해리는 삼촌이 죽어서까지 자신의 알고리즘 실력을 시험하지 않기를 바란다. 다행히 그를 도와줄 좋은 친구들이 있다. 유언장에 남은 수열이 주어졌을 때, 이에 맞는 암호를 모두 구하라. 유언장이 얼룩져 있어서 해가 전혀 없을 수도 있다.

입력

첫 줄에 테스트 케이스의 개수 zz가 주어진다 (1≤z≤2000001 \le z \le 200000). 각 테스트 케이스는 두 줄로 이루어진다. 첫 줄에는 암호의 길이이자 블랙의 수열의 길이인 정수 nn이 주어진다 (2≤n≤10000002 \le n \le 1000000). 둘째 줄에는 회문 반지름 p1,p2,…,pnp_1, p_2, \ldots, p_n (0≤pi≤n0 \le p_i \le n)이 주어진다. 모든 테스트 케이스의 nn을 합한 값은 5×1075 \times 10^7을 넘지 않는다.

출력

각 테스트 케이스마다 먼저 가능한 암호의 개수 kk를 출력한다. kk가 0보다 크면 다음 kk줄에 가능한 암호를 모두 0과 1로 이루어진 수열로 사전 순으로 출력한다. kk는 100을 넘지 않는다고 가정해도 된다.

예제1

  1. 예제 1

    입력
    1
    8
    0 1 0 3 0 1 1 0
    
    예상 출력
    4
    00010000
    01000101
    10111010
    11101111