본문 바로가기

Computer Science/Problem Solving

(12)
0826 Problem Solving 푼 시간 순서입니다. BOJ 19265 Is It a p-drome? 간단한 FFT, 해싱 문제이다. 일단 무지성으로 각 부분열에 대해 Rabin Fingerprint를 찍고 생각하자. 순열 p를 순열 사이클 분할을 해 '같아야만 하는 index들'의 집합을 적절히 구한다. 이러한 집합을 적절히 구하고 나면, 만약 부분열이 p-drome일 경우 Rabin FingerPrint를 C라 하면 C = sigma i = 0 ~ M-1 A[i] * B[i] (B[i] = sigma j = 0 ~ M-1, i and j is in same cycle, i is smallest on that cycle : h^j mod p) 와 같은 식이 도출된다. 이는 FFT로 쉽게 구할 수 있고, 이 값이 Rabin Finger..
0825 Problem Solving 2020년 2차 선발고사를 쳐봤습니다. 아이싱 문제는 풀이를 이전에 접한 적이 있어서, 첫 3문제만을 풀었습니다. 결과 : 150 / 43 / 18 1. 마법의 다이얼 먼저 좌표 압축을 한 뒤, 각 다이얼 기준으로 i번째 칸에 다이얼을 모으게 될 때 얼마나 돌려야 할지를 생각해보자. 이는 함수 y = ax + b 꼴들로 나타내어지며, 따라서 각 칸 별로 x의 계수, 상수항을 저장해둔 뒤 prefix sum을 잘 관리해주면 풀 수 있다. 2. 하나 둘 셋 43점 (서브테스크 1, 2) : 먼저 다항식 시간복잡도의 풀이를 위해선 다음과 같은 아이디어를 얻어야 한다. (1, 2, 3) 쌍의 개수와 (3, 2, 1) 쌍의 개수를 정하고 생각해보면, 1과 3의 위치를 그리디하게 선택 가능하고, 무슨 1을 무슨 3..
0823 Problem Solving 2020년도 1차 국가대표 선발고사 시험을 쳐봤습니다. 결과 : 100 / 48 / 47 / 100 1. 문자열 찾기 100점 : S1의 연속된 부분문자열 중 S2와 '사실상 같은' 것의 개수를 구하면 된다. '사실상 같다' 라는 것은 먼저 두 문자열의 길이가 같고, 쌍 (i, j)에 대해 S1[i] == S1[j] S2[i]==S2[j]임을 의미한다. 이는 간단한 해싱으로 가능하다. 알파벳의 개수는 총 26개이므로, 각 26개의 알파벳에 대해 Rabin - Fingerprint를 찍는다. 두 문자열이 '사실상 같다' 이러면 S1, S2에 대해 이 Rabin-Fingerprint의 집합들이 같아야 한다. set으로 비교하거나, 혹은 전체를 xor해서 같으면 같다고 해싱하는 것도 좋은 것 같다. 난 후자로..
0822 Problem Solving 푼 문제들을 정리해 보자. 푼 문제들은 난이도순이 아닌 시간순이다. 08/16 Codeforces Round #814 (Div. 1) 29등을 해 오랜만에 LGM 퍼포를 받았다. A1, A2 : Burenka and Traditions 문제를 잘 분석하면 range가 1인 시행, range가 2인 시행으로 분할할 수 있고 2인 시행을 많이 할 수록 유리하다는 것을 깨달을 수 있다. range 2인 시행을 함으로써 이익이 되기 위하려면 구간 l~r 에 대해 A[l] ^ A[l+1] ^ .. ^ A[r] = 0이어야 하고, 이 구간에서 1만큼의 이득을 얻을 수 있다. 이는 map을 통해 prefix xor값을 C[i]라 하면 prefix xor이 c가 되는 최소의 i를 M[c] = i라고 정의한 다음, 이를..