문제: https://atcoder.jp/contests/jsc2019-qual/tasks/jsc2019_qual_c
해설: https://img.atcoder.jp/jsc2019-qual/editorial.pdf
- 간단한듯 보이는 문제이지만 너무 어려웠다. 이게 어떻게 C번인지 이해가 안감..
- 그리고 이걸 푼 사람들도 새삼 대단해보인다.
- 문제를 정리하면 다음과 같다.
B
와W
로 구성 된2N
길이의 문자열이 있다.N
은 $10^5$으로 $O(N\log{N})$ 이하의 풀이가 필요하다.- 문자를 2개씩 총
N
번 선택한다. 이때 각 문자는 1번만 사용할 수 있다. 즉 모든 문자가 딱 1번씩만 선택된다. - 선택한 문자 2개를 포함하여 그 사이에 있는 문자가 inversion된다.
B
는W
로,W
는B
로 inversion 된다. - 최중 문자열을 모두
W
로 만드는 선택의 경우의 수를 출력하라.
첫 번째 명제
일단 문제의 조건에 부합하는 선택을 하면서, 각 문자를
L
과R
로 분류하자.L
은 선택시 왼쪽에 있을 문자,R
은 선택시 오른쪽에 있을 문자이다. 선택 이후 도출된LLRR
과 같은 문자열에서L
과R
을 어떤 순서로 짝짓든간에 무조건 결과가 같다.
문제를 푸는 동안 심지어 첫번째 명제 조차 눈치채지 못했다! 그리고 Editorial을 보면서도 이해하는데 한참이나 걸렸다. 무진장 자괴감이 온다. 여튼 증명은 다음과 같다.
- 일단 예를들어 생각하자.
BWWB
가 입력으로 주어지면,LLRR
을 위의 선택의 예시로 생각해 볼 수 있다. 두가지 가능성을 생각해볼 수 있다.- 1,3과 2,4를 짝짓는 경우
- 1,4와 2,3을 짝짓는 경우
- 위의 두가지 가능성 모두 결과가
WWWW
로 같다. - 왜나하면 선택에 포함되는 횟수가 항상 같기 때문이다.
- 1은 선택에 1번 포함되고
- 2는 선택에 2번 포함되고
- 3은 선택에 2번 포함되고
- 4는 선택에 1번 포함된다
- 위의 예시를 근거로 생각해 볼때, 최종 결과는 선택에 포함되는 횟수가 결정한다.
- 선택에 포함되는 횟수는, 아래와 같이 결정된다.
L
인 문자: 왼쪽에 있는L
의 수를 $L_i$라 두고,R
의 수를 $R_i$라 둘 때, $L_i - R_i + 1$이 선택에 포함되는 횟수이다.R
인 문자: 반대
- 결국
LLRR
과 같은 문자열이 도출되면, 어떤 순서로 짝을 짓든간에 각 문자가 선택에 포함되는 횟수는 동일하다.
두 번째 명제
첫 번째 명제에서 처럼
L
과R
로 선택을 해서 도출되는LLRR
과 같은 결과물을X
라고 하자. 이X
는 반드시 하나만 존재한다.
사실 첫번째 명제를 생각하지 못하게 만드는 이유는, 두번째 명제가 없기 때문이다. X
가 반드시 하나만 존재한다는 보장이 있으면, 1번을 더 생각해내기 쉬울 것이다. 여튼 여러개의 보조명제를 이용해서 증명해보자.
보조명제1: 왼쪽 끝은 반드시
B
이고,L
이어야 한다.W
이라면 답은 0이다.
비교적 쉽게 증명할 수 있다.
- 왼쪽 끝이면 반드시
L
이 된다.R
이 선택된다면 짝지을L
을 찾을 수 없기 때문이다. - 이제 첫 번째 명제에서 사용한 선택에 포함되는 횟수를 계산해 보면, 1이 나온다. 즉
B
가 왼쪽 끝에 있어야 1번 inversion되어서W
가 된다.
보조명제2: 나머지 Cell에 대해서 아래가 성립한다.
문자열 | 홀수번째 | 짝수번째 |
---|---|---|
B | L | R |
W | R | L |
증명은 아래와 같다.
- 두번째 Cell을 생각해보자. 첫번째는 무조건
B
/L
이니 왼쪽으로 부터 1개의 선택이 강요된다.- 만약 두번째 Cell이
B
라면L
이 되어선 안된다. 그럼 선택된 횟수가 2로 늘어나서 다시B
가 된다. 그러니R
이 되어야 한다. - 만약 두번째 Cell이
W
라면R
이 되어선 안된다. 그럼 선택된 횟수가 1뿐이므로B
가 된다. 그러니L
이 되어야 한다.
- 만약 두번째 Cell이
- 두 번째 Cell까지 선택된 결과는 아래와 같다.
BB
->LR
BW
->LL
- 즉 세 번째 Cell에서는 선택된 횟수가 무조건 짝수번 누적된 채로 시작한다.
- 그러므로 처음부터 시작하는거랑 유사해진다.
- 그러나
W
가 될 수도 있다. 이 경우를 생각해보면BBW
는 될 수 없다.- 논리상
LR
뒤에서 짝수를 유지하려면R
이 붙어야 한다. - 그러나
LRR
이 된다면R
과 짝지을L
의 수가 부족하다. BWW
는LLR
로 가능하다.
- 논리상
- 결론적으로 세번째에서
B
가 된 경우는 모두L
이고,W
가 된 경우는 모두R
이다.
- 이를 반복해 보면 홀/짝에서 위 표와 같은 규칙을 찾을 수 있다.
이제 보조명제2를 활용하면 X
가 하나인 것이 도출된다. B
와 W
가 정해지면 L
과 R
은 한 가지 값으로 결정되기 때문이다.
마지막 계산
이제 계산하는 부분만 남았다. LLRLRR
인 문자열을 생각해보자.
- 가장 왼쪽에 있는
R
부터 선택을 하면, 짝지을 수 있는L
의 수가 2개이다. - 그 다음
R
은 짝지을L
의 수가 3개이지만, 앞선R
이 한개를 썼으므로 총 2개이다. - 마지막
R
은 짝지을L
의 수가 3개이지만, 앞선 두개의R
이 이미 선택되었으므로, 가능한 경우의 수가 1가지 이다.
최종 결과는 $3\times2\times1 = 6$이다. 같은 방법으로 LLLRRLRR
을 계산해보면 $3\times2\times2 = 12$ 가 나온다. 이를 구현하면 된다.