부분문자열 필수 트릭 - doubling cyclic substring trick
24597번: Reversibly Cyclic Strings (acmicpc.net)
문자열 s의 cyclic substring이라는 것은 s를 rotate했을때 부분문자열 t를 말한다.
'fatcat'에서 'atf'는 fatcat에서 왼쪽으로 1칸 rotate하면 atcatf인데 여기에 부분문자열로 있다
만약 s의 모든 부분문자열 t에 대하여 t를 뒤집은 것이 s의 cyclic substring이라면 s를 'Internally Reversibly Cyclic'이라고 정의한다.
주어진 s가 Internally Reversibly Cyclic인지 판단하는 문제
어떤 부분 문자열 t가 s의 cyclic substring이라는 것을 어떻게 알 수 있을까?
한칸 한칸씩 roate해서 판단해봐야할까?
fatcat
tfatcaatfatccatfattcatfaatcatf...
이런 문자열을 모두 포함할 수 있는 문자열은 원본 문자열을 이어붙이면 된다
fatcatfatcat에 fatcat, tfatca, atfatc, catfat, tcatfa, atcatf가 다 있어
어떤 부분문자열 t가 fatcat, tfatca, atfatc, catfat, tcatfa, atcatf 각각에서 부분문자열인지 하나하나 확인하는 것보다
t가 fatcatfatcat의 부분문자열인지만 확인하면 된다.
그러면 fatcatfatcat에서 fatcat의 모든 부분문자열을 뒤집은 문자열이 부분문자열로 존재하는지 확인하면 된다
모든 부분문자열을 하나하나 다 확인해서 뒤집은 다음 하나하나 다 확인해봐야할까?
모든 부분문자열은 fatcat에 존재하므로 fatcat를 뒤집은 문자열 tactaf가 fatcatfatcat에 존재하는지만 확인하면 충분하다
모든 부분문자열을 뒤집은 문자열 t1,t2,t3,...가 tactaf의 부분문자열이므로
tactaf가 fatcatfatcat의 부분문자열이라면..?
t1,t2,t3,...도 fatcatfatcat의 부분문자열이다.
--------------------------------------------------------------------------------------------------------------------------------------------------
1) cyclic substring인지 확인할려면 원본문자열을 한번더 이어붙인 문자열에서 substring인지 체크
2) s의 모든 부분문자열이 t의 부분문자열인가?
>> s의 모든 부분문자열은 s의 부분문자열이므로 s가 t의 부분문자열이면 당연히 s의 모든 부분문자열도 t에 들어있다
s = input()
t = s[::-1]
s += s
if t in s:
print(1)
else:
print(0)
'알고리즘 > 문자열 알고리즘' 카테고리의 다른 글
문자열 hashing function 빠르게 계산하는 방법 (0) | 2024.05.18 |
---|---|
z function 활용법 2 - prefix이면서 suffix인 문자열을 찾는 방법- (0) | 2023.09.28 |
z - function 활용법1 -패턴이 문자열에서 몇번이나 나왔는가? 찾는법- (0) | 2023.09.18 |
문자열과 접미사의 가장 긴 공통 접두사의 길이를 찾는 z 알고리즘 배우기 (0) | 2023.09.17 |
suffix array 깊이 이해하기 2 -부분 문자열의 개수를 세는 방법- (0) | 2023.09.09 |