Random Index Vectors

면접 대비

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

요약
두 희소 벡터를 병합해 합과 곱을 구하고 두 벡터를 각각 k만큼 회전시켜 응축 형식으로 출력합니다.
난이도

보통10점 중 6점

유형
투 포인터, 해시맵, 구현, 정렬
정답자
아직 제출이 없습니다

문제

Random Index Vectors(RIV)는 패턴 매칭에 쓰이는 비교적 새로운 기법이다. RIV는 1과 -1로 이루어진 크고 희소한 벡터다. 무작위로 생성하면 두 RIV의 내적은 0이거나 0에 매우 가까우므로, 서로 직교하거나 거의 직교한다. RIV는 여러 속성에 하나씩 할당한 뒤 특정한 방식으로 결합해 그 속성들을 가진 패턴의 벡터를 만드는 데 쓰인다. 그러면 두 패턴의 벡터 사이 각의 코사인을 두 패턴의 유사도로 사용할 수 있다.

RIV에는 세 가지 기본 연산이 있다.

  • 두 RIV를 원소별로 더할 수 있다: Ci = Ai+Bi.
    • RIV의 비영 원소는 1과 -1뿐이므로 1+1=1이고 -1+-1=-1이다.
  • 두 RIV를 원소별로 곱할 수 있다: Ci = Ai×Bi.
  • 한 RIV를 정수 k만큼 회전할 수 있다. 모든 값을 왼쪽(인덱스가 작아지는 방향)으로 k만큼 옮기고, 벡터 앞쪽에서 밀려난 값은 끝으로 간다.

RIV는 크고 희소하기 때문에 보통 압축된 표현을 쓴다. 벡터는 값이 비영인 위치의 인덱스(1부터 시작)를 정렬한 목록으로 나타내며, 값이 -1이면 그 인덱스에 음수 부호를 붙인다. 표현은 비영 인덱스의 개수로 시작한다.

예를 들어 다음 RIV를 보자.

1 0 -1 0 0 0 -1 0 0 1 0

비영 원소가 인덱스 1, 3, 7, 10에 4개 있다. 압축 표현은 다음과 같다.

4 1 -3 -7 10

압축 표현으로 주어진 두 RIV에 대해 덧셈, 곱셈, 그리고 두 벡터 각각의 회전을 수행하라. 결과 벡터를 압축 형태로 출력하라.

입력

입력은 테스트 케이스 하나로 이루어진다. 프로그램은 서로 다른 입력으로 여러 번 실행될 수 있다.

각 테스트 케이스의 첫 줄에는 공백으로 구분된 두 정수 n (1 ≤ n ≤ 1018)과 k (1 ≤ k ≤ n)가 주어진다. n은 벡터의 최대 인덱스이고, k는 회전할 칸 수다.

다음 두 줄에는 각각 압축 형태의 벡터가 주어진다. 정수 m (0 ≤ m ≤ 1,000)으로 시작하고 그 뒤에 m개의 인덱스 i (1 ≤ |i| ≤ n)가 공백으로 구분되어 이어진다.

출력

네 개의 Random Index Vector를 한 줄에 하나씩 압축 형태로 출력한다.

  • 첫째 줄에는 입력 벡터의 합을 출력한다.
  • 둘째 줄에는 입력 벡터의 곱을 출력한다.
  • 셋째 줄에는 첫 번째 입력 벡터를 k만큼 회전한 결과를 출력한다.
  • 넷째 줄에는 두 번째 입력 벡터를 k만큼 회전한 결과를 출력한다.

예제2

  1. 예제 1

    입력
    30 13
    6 6 -9 -13 18 22 26
    8 -1 3 7 11 13 19 20 -27
    
    예상 출력
    12 -1 3 6 7 -9 11 18 19 20 22 26 -27
    1 -13
    6 5 9 13 23 -26 -30
    8 6 7 -14 -18 20 24 28 30
    
  2. 예제 2

    입력
    20 4
    9 -2 -4 -8 -11 -12 15 18 19 20
    7 4 5 -10 11 15 18 -20
    
    예상 출력
    8 -2 5 -8 -10 -12 15 18 19
    5 -4 -11 15 18 -20
    9 -4 -7 -8 11 14 15 16 -18 -20
    7 1 -6 7 11 14 -16 20