만드는 중입니다

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

문자열 해싱

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

요약
ASCII 32부터 126까지의 문자로 이루어진 모든 길이의 문자열 중에서 주어진 문자열과 해시가 같은 것의 개수를 1,000,000,007로 나눈 나머지로 구한다.
난이도

보통10점 중 7점

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

문제

문자열 해싱은 임의의 문자열을 하나의 수로 바꾸는 방법이다. 길이가 NN인 문자열 SS의 해시를 다음과 같이 정의한다.

S[0]×31N−1+S[1]×31N−2+⋯+S[N−2]×31+S[N−1]S[0] \times 31^{N-1} + S[1] \times 31^{N-2} + \cdots + S[N-2] \times 31 + S[N-1]

S[i]S[i]는 ii번째 문자의 ASCII 코드이고, 31k31^k는 31을 kk번 곱한 값이다. 계산은 큰 정수로 하므로 자리 넘침은 일어나지 않는다.

문자열 몇 개와 그 해시를 예로 들면 다음과 같다.

  1. "ab" (N=2N = 2, ASCII 코드 97 98), 해시 =97×31+98=3105= 97 \times 31 + 98 = 3105
  2. "Hi!" (N=3N = 3, ASCII 코드 72 105 33), 해시 =72×312+105×31+33=72480= 72 \times 31^2 + 105 \times 31 + 33 = 72480
  3. "IJ!" (N=3N = 3, ASCII 코드 73 74 33), 해시 =73×312+74×31+33=72480= 73 \times 31^2 + 74 \times 31 + 33 = 72480

두 번째와 세 번째처럼 서로 다른 문자열의 해시가 같을 때도 있다.

모든 문자의 ASCII 코드가 32 이상 126 이하인 문자열을 올바른 문자열이라고 한다.

주어진 문자열과 해시가 같은 올바른 문자열이 몇 개인지 구한다.

입력

입력은 여러 줄로 이루어진다. 각 줄은 공백으로 구분된 정수 나열로 문자열 하나를 나타내며, 형식은 다음과 같다.

N  S[0]  S[1]  ⋯  S[N−1]N\;S[0]\;S[1]\;\cdots\;S[N-1]

NN은 문자열의 길이이고 (1≤N≤10001 \le N \le 1000), S[i]S[i]는 ii번째 문자의 ASCII 코드다 (32≤S[i]≤12632 \le S[i] \le 126).

N=0N = 0인 줄은 입력의 끝을 뜻하며 처리하지 않는다.

출력

문자열마다 해시가 같은 올바른 문자열의 개수를 1 000 000 0071\,000\,000\,007로 나눈 나머지를 한 줄에 출력한다. 개수에는 입력으로 주어진 문자열 자신도 포함한다.

힌트

"ab"의 해시는 3105이다. 해시가 3105인 올바른 문자열은 "bC"(ASCII 98 67)와 "c$"(ASCII 99 36) 두 개가 더 있으므로 자신을 포함해 모두 3개다. ASCII 코드가 100 5인 문자열도 해시가 3105지만 5가 32보다 작아서 올바른 문자열이 아니다.

"Hi!"의 해시는 72480이고, 해시가 72480인 올바른 문자열은 12개다.

공백 세 개로 이루어진 문자열의 해시는 31776이고, 해시가 31776인 올바른 문자열은 자신뿐이다.

예제1

  1. 예제 1

    입력
    2 97 98
    3 72 105 33
    3 32 32 32
    0
    
    예상 출력
    3
    12
    1