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

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

올레그와 이진 수열

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

요약
길이 n인 이진 수열의 Z-함수 값 일부가 주어지고 -1은 지워진 값일 때, 주어진 값을 만족하는 이진 수열의 개수를 10^9+7로 나눈 나머지를 구한다.
난이도

어려움10점 중 9점

유형
문자열 매칭, 동적 계획법, 조합론, 문자열
정답자
아직 제출이 없습니다

문제

올레그는 0과 1로 이루어진 이진 수열을 아주 좋아한다. 얼마 전 그는 공책에 nn개의 원소로 이루어진 이진 수열을 하나 적었다. 올레그는 적은 수열에 대해 Z-함수를 계산했다.

수열 s1,…,sns_1, \ldots, s_n의 Z-함수란 배열 z[1..n]z[1..n]이며, 다음과 같이 정의된다.

  • z[1]=0z[1] = 0;
  • i>1i > 1일 때, z[i]z[i]는 수열 ss와 ii번째 위치에서 시작하는 ss의 접미사의 최장 공통 접두사의 길이이다. 다시 말해 z[i]z[i]는 s1=sis_1 = s_i, s2=si+1s_2 = s_{i+1}, ..., sk=si+k−1s_{k} = s_{i+k-1}을 만족하는 최대 kk이다.

예를 들어 수열 s=⟨0,0,1,1,0,0,1⟩s = \langle 0, 0, 1, 1, 0, 0, 1 \rangle의 Z-함수는 z=⟨0,1,0,0,3,1,0⟩z = \langle 0, 1, 0, 0, 3, 1, 0\rangle이다.

공책에 수열과 그 Z-함수를 적은 올레그는 잠이 들었다. 그가 자는 동안 남동생 예고르가 방에 몰래 들어와 수열과 Z-함수의 일부 값을 형광펜으로 지웠다. 잠에서 깬 올레그는, 지워지지 않고 남은 Z-함수의 값이 올바르게 되는 그러한 이진 수열을 그가 저녁에 몇 개나 공책에 적었을 수 있는지 궁금해졌다.

조건을 만족하는 수열의 개수를 구해 109+710^9 + 7로 나눈 나머지를 출력하라. 올레그가 Z-함수를 계산할 때 실수했을 수도 있으며, 이 경우에는 어떤 수열도 조건을 만족하지 않으므로 답은 0이다.

입력

첫째 줄에 원래 이진 수열의 길이 nn이 주어진다 (1≤n≤10001 \le n \le 1000). 둘째 줄에 nn개의 정수 z[1],…,z[n]z[1], \ldots, z[n]이 주어지며, z[i]z[i]는 ii번째 위치의 Z-함수 값이고, ii번째 위치의 값이 지워졌다면 −1-1이다 (−1≤z[i]≤n-1 \le z[i] \le n).

출력

조건을 만족하는 이진 수열의 개수를 109+710^9 + 7로 나눈 나머지를 한 줄에 출력한다.

힌트

첫 번째 예제에서는 수열 ⟨0,1,0⟩\langle 0, 1, 0 \rangle과 ⟨1,0,1⟩\langle 1, 0, 1 \rangle이 조건을 만족한다.

두 번째 예제에서는 주어진 Z-함수를 갖는 길이 4의 이진 수열이 존재하지 않는다.

세 번째 예제에서는 z[2]=3z[2] = 3이며, 이는 Z-함수의 정의에 어긋나므로 답은 0이다.

네 번째 예제에서는 길이 3의 모든 이진 수열이 조건을 만족한다.

예제4

  1. 예제 1

    입력
    3
    0 0 1
    
    예상 출력
    2
    
  2. 예제 2

    입력
    4
    0 0 1 0
    
    예상 출력
    0
    
  3. 예제 3

    입력
    3
    0 3 -1
    
    예상 출력
    0
    
  4. 예제 4

    입력
    3
    -1 -1 -1
    
    예상 출력
    8