주어진 배열의 비어 있지 않은 부분수열 중 사전 순으로 가장 작은 K개를 골라 각 다항 해시를 출력합니다.
어려움8힙정렬조합론아직 제출이 없습니다시간 제한1초메모리 제한256 MB길이가 N인 정수 배열이 주어진다. 이 배열의 비어 있지 않은 부분 수열을 모두 사전순으로 정렬한 결과를 s1,s2,…,sq라고 하자. 부분 수열은 원래 배열에서 원소를 0개 이상 지워서 만드는 배열이다. 값이 서로 같은 부분 수열이 여러 개 나올 수 있고, q=2N−1이다.
배열 A가 배열 B보다 사전순으로 앞선다는 것은, 두 배열이 처음으로 달라지는 위치 i에서 Ai<Bi이거나 A가 B의 진 접두사인 경우를 뜻한다.
값이 v1,v2,…,vp인 배열의 해시는 다음과 같이 정의한다.
h(s)=(v1Bp−1+v2Bp−2+⋯+vp−1B+vp)modM
B와 M은 입력으로 주어지는 정수다. K가 주어질 때 h(s1),h(s2),…,h(sK)를 구한다.
첫째 줄에 정수 N, K, B, M이 주어진다. (1≤N≤100000, 1≤K≤100000, 1≤B,M≤1000000)
둘째 줄에 정수 a1,a2,…,aN이 주어진다. (1≤ai≤100000)
모든 입력에서 K≤2N−1이 성립한다.
K개의 줄을 출력한다. j번째 줄에는 h(sj)를 출력한다.
첫 번째 예제에서 정렬된 부분 수열은 s1=[1], s2=[1,2], s3=[2]이다. 따라서 h(s1)=1mod5=1, h(s2)=(1+2)mod5=3, h(s3)=2mod5=2이다.
두 번째 예제에서 정렬된 부분 수열은 s1=[1], s2=[1], s3=[1,1], s4=[1,3]이다. 값이 1인 원소가 두 개이므로 [1]이 두 번 나온다. 따라서 h(s1)=1mod3=1, h(s2)=1mod3=1, h(s3)=(1×2+1)mod3=0, h(s4)=(1×2+3)mod3=2이다.