2018. 9. 5. 16:59ㆍ알고리즘 문풀/Others
현재 스코어 100 / 600. 과연 추가할 수 있을런지는 모르겠다...
myungwoo님의 블로그에서 (아마) 모든 문제의 풀이를 확인할 수 있다. 아직은 보지 않은 상태.
18.09.05 P1 solved.
P1. Combo
꽤 괜찮은 interactive 문제. IOI치고 너무 쉬워서 만점자가 240명 가까이 나왔다는 게 유일한 흠이다.
길이 \(N\)인 미지의 문자열 \(S\)가 주어진다.
\(S\)에 주어진 특징은 A, B, X, Y 4개의 문자로 이루어져 있다는 것이고, \(S\)의 첫번째 문자는 \(S\) 안에서 다시 등장하지 않는다는 것이다.
이 때 다음의 함수 press(p)를 최대 \(N+2\)번 호출하여 \(S\)를 찾아야 한다 :
길이가 \(4N\) 이하인 문자열 \(p\)를 사용자 임의로 정하여 함수의 parameter로 넘긴다.
이 함수의 반환값은 \(p\)의 substring 중 \(S\)의 가장 긴 prefix의 길이이다.
Solution.
우선 첫 번째 문자를 2번만에 알아낼 수 있다.
press("AB")가
1인 경우 :
press("A")가 1이면 A, 0이면 B.
0인 경우 :
press("X")가 1이면 X, 0이면 Y.
첫 번째 문자가 다시 나오지 않는다는 점을 활용하여 \(N-1\)번째 문자까지를 문자 하나 당 1번만에 알아낼 수 있다. 일반성을 잃지 않고 첫 번째 문자를 A라고 하자.
지금까지 알아낸 \(S\)의 부분문자열을 \(P\)라고 하자. \(|P| \le N-2\).
"PBB" "PBX" "PBY" "PX"를 붙여서 PBBPBXPBYPX를 쿼리로 날린다.
이 문자열의 press 값에 따라 \(|P|+1\)번째 문자를 결정할 수 있다.
\(|P| + 2\)인 경우 : B.
\(|P| + 1\)인 경우 : X.
\(|P|\)인 경우 : Y.
하지만 이 방법으로는 마지막 문자를 결정할 수 없다. 마지막 문자는 다시 Naive로 2번만에 결정해 주면 총 호출 횟수는 \(N+2\)번이 된다.
\(p\)의 길이를 \(3N\)으로 줄일 수 있다는 소문이 있는데... 모르겠다.
P2. Seats
'알고리즘 문풀 > Others' 카테고리의 다른 글
[추석맞이 폴란드 스터디] 180923 (4) | 2018.09.24 |
---|---|
[추석맞이 폴란드 스터디] 180922 (0) | 2018.09.22 |
제 2회 소프트콘 후기 (0) | 2018.08.13 |
자기곱 (COI 2008) (1) | 2018.08.02 |
UCPC 2018 후기 (0) | 2018.07.30 |