DOJ logoDOJ
문제
최근 추가된 문제들저장한 문제
카테고리DLC대회그룹팀게시판
랭킹
문제 풀이 랭킹스트릭 랭킹DOJ Power 랭킹
현황
문제 제안로그인회원가입
DOJ logoDOJ

OI 서브태스크 채점, Elo 레이팅, Discord 인증을 갖춘 커뮤니티 온라인 저지.

문제
문제 목록카테고리
커뮤니티
대회랭킹게시판공지사항외부 대회 개최이용 안내
계정
로그인회원가입채점 현황
정책
이용약관DLC 이용 규칙개인정보 처리방침API 사용 설명서언어별 채점 환경대회 순위 보상레이팅과 퍼포먼스
© 2026 DOJ
모든 권리 보유
해설

사라지는 문자열

문제로 돌아가기

해설

문자열 TTT에 대해 다음 두 값을 정의하자.

D0(T)D_0(T)D0​(T)는 TTT의 상대적 홀수 번째 위치에 있는 0의 개수에서 상대적 짝수 번째 위치에 있는 0의 개수를 뺀 값이다.

D1(T)D_1(T)D1​(T)는 TTT의 상대적 홀수 번째 위치에 있는 1의 개수에서 상대적 짝수 번째 위치에 있는 1의 개수를 뺀 값이다.

어떤 문자열이 사라지는 문자열이라면 반드시

D0(T)=D1(T)=0D_0(T)=D_1(T)=0D0​(T)=D1​(T)=0

이다.

인접한 같은 문자 두 개를 지울 때 두 문자는 현재 문자열에서 하나는 홀수 번째 위치, 다른 하나는 짝수 번째 위치에 있다. 따라서 같은 문자의 홀수 번째 개수와 짝수 번째 개수가 각각 하나씩 줄어들고, D0,D1D_0,D_1D0​,D1​은 변하지 않는다. 빈 문자열에서는 두 값이 모두 000이므로 필요성이 성립한다.

반대로 D0(T)=D1(T)=0D_0(T)=D_1(T)=0D0​(T)=D1​(T)=0이라면 TT는 항상 사라진다. 가 비어 있으면 자명하다. 가 비어 있지 않은데 인접한 같은 문자가 없다면 는 또는 꼴의 교대 문자열이다. 이 경우 한 문자는 홀수 번째 위치에만, 다른 문자는 짝수 번째 위치에만 나타나므로 일 수 없다.

따라서 비어 있지 않은 TTT에는 인접한 같은 문자가 존재한다. 그 두 문자를 지워도 D0,D1D_0,D_1D0​,D1​은 계속 000이고 길이는 줄어든다. 이를 반복하면 결국 빈 문자열이 된다.

즉, 부분문자열이 사라지는 문자열일 필요충분조건은 D0=D1=0D_0=D_1=0D0​=D1​=0이다.

이제 원래 문자열의 위치 iii가 홀수이면 부호를 +1+1+1, 짝수이면 부호를 −1-1−1로 둔다. prefix 상태

Pi=(p0,i,p1,i)P_i=(p_{0,i},p_{1,i})Pi​=(p0,i​,p

를 다음과 같이 정의한다.

p0,ip_{0,i}p0,i​는 111번부터 iii번까지의 0에 대해 위치의 부호를 모두 더한 값이다.

p1,ip_{1,i}p1,i​는 111번부터 iii번까지의 1에 대해 위치의 부호를 모두 더한 값이다.

부분문자열 SlSl+1⋯SrS_lS_{l+1}\cdots S_rSl​Sl+1​⋯Sr​에서 상대적인 위치의 홀짝은 의 홀짝에 따라 원래 위치의 홀짝과 같거나 모두 반대가 된다. 하지만 두 부호가 모두 반대가 되어도 인지 여부는 변하지 않는다.

따라서

SlSl+1⋯SrS_lS_{l+1}\cdots S_rSl​Sl+1​⋯Sr​

가 사라지는 문자열일 필요충분조건은

Pr=Pl−1P_r=P_{l-1}Pr​=Pl−1​

이다.

왼쪽부터 prefix 상태를 계산하면서 지금까지 같은 상태가 몇 번 등장했는지 저장한다. 현재 상태가 이전에 ccc번 등장했다면 현재 위치에서 끝나는 사라지는 부분문자열이 ccc개 추가된다. 처음에는 빈 prefix의 상태 (0,0)(0,0)(0,0)이 한 번 등장했다고 두면 된다.

상태를 map으로 관리하면 O(Nlog⁡N)O(N\log N)O(NlogN), hash map으로 관리하면 평균 O(N)O(N)O(N)에 해결할 수 있다. 메모리 사용량은 O(N)O(N)O(N)이다.

부분문자열의 개수는 최대

N(N+1)2\frac{N(N+1)}{2}2N(N+1)​

이고 N≤200 000N\leq200\,000N≤200000이므로 정답은 항상 부호 있는 646464비트 정수 범위에 들어간다.

Solution written by GPT5.6

T
TTT
TTT
TTT
0101
⋯\cdots⋯
1010
⋯\cdots⋯
D0=D1=0D_0=D_1=0D0​=D1​=0
22
2
1,i
​
)
ll
l
D0=D1=0D_0=D_1=0D0​=D1​=0