코드 복원하기

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

요약
길이 L인 모든 연속 부분 문자열의 해시가 주어질 때 길이 N인 숫자 비밀번호를 복원하고, 가능한 답 중 사전순으로 가장 앞선 것을 출력한다.
난이도

보통10점 중 7점

유형
수학, 정수론, 해시맵, 구현
정답자
아직 제출이 없습니다

문제

달구의 프로그램은 00에서 99까지의 숫자로만 이루어진 코드를 비밀번호로 이용한다. 사용자의 보안을 위해, 달구의 프로그램은 길이 NN의 비밀번호 ss에 대해 a_i=h(s_is_i+1⋯s_i+L−1)a\_i = h(s\_is\_{i+1}\cdots s\_{i+L-1})로 해싱하여 만든 수열 a_1a\_1, a_2a\_2, ⋯\cdots, a_N−L+1a\_{N-L+1}을 파일에 저장한다.

이때, s_is_i+1⋯s_i+L−1s\_is\_{i+1}\cdots s\_{i+L-1}은 ss의 ii 번째 숫자 부터 i+L−1i+L-1 번째 숫자까지를 이어 붙인 문자열이며, 어떤 숫자로만 이루어진 문자열 tt에 대한 해시 함수 h(t)h(t)는 다음과 같다.

h(t)=∑_i=1∣t∣t\[i]×17(∣t∣−i)(mod109+7)h(t) = \sum\_{i=1}^{|t|}{t\[i] \times 17^{(|t|-i)}} \pmod{10^9+7}

t\[i]t\[i]는 tt의 ii번째 문자이다. 문자 0, 1, 2, ⋯\cdots, 9는 각각 정수 00, 11, 22, ⋯\cdots, 99 로 대응된다.

모든 수열과 문자열의 인덱스는 11부터 시작한다.

이 방식이 안전하다고 생각하는 달구를 위해 코드를 복원해보자.

입력

첫째 줄에 정수 NN과 LL이 공백으로 구분되어 주어진다. (1≤N≤100,0001 \le N \le 100\\,000; 1≤L≤⌊N2⌋1 \le L \le \lfloor \displaystyle\frac{N}{2}\rfloor)

둘째 줄에 수열 a_1a\_1, a_2a\_2, ⋯\cdots, a_N−L+1a\_{N-L+1}이 공백으로 구분되어 주어진다. (0≤a_i<109+70 \le a\_i \lt 10^9+7)

비밀번호를 복원할 수 있는 수열만 입력으로 주어진다.

출력

첫째 줄에 복원한 달구의 비밀번호를 출력한다.

복원 가능한 비밀번호가 여러 개 존재할 경우 사전순으로 가장 앞서는 비밀번호를 출력한다.

예제2

  1. 예제 1

    입력
    12 2
    23 104 42 139 59 137 18 26 154 23 102
    
    예상 출력
    162838119160
    
  2. 예제 2

    입력
    4 2
    37 58 123
    
    예상 출력
    2374