devbelly   3년 전

현재 문자열 알고리즘

접미사배열

KMP

트라이

는 공부를 한 상태이고

아호코라식

라빈카프

는 공부를 안했는데용 

오늘 라빈카프를 공부하려고 글을 찬찬히 읽는데 데이터에 따라 시간초과도 날 수 있고 저격가능성도 농후 하다고 봤습니다.

질문 1. 라빈카프를 사용해야만 풀리는 문제가 있나요?

질문 2. (질문1과 비슷하지만) 라빈카프로 풀 수 있는 문제는 KMP로 다 풀 수가 있나요?

질문 3. 위 5개 말고도 공부해두면 좋을 문자열 알고리즘이 더 있나요?

이상입니다

sait2000   3년 전

질문 1은 잘 모르겠습니다. 질문 2는 역시 잘 모르지만 제 추측으로는 아마 아닐 것 같습니다. 예를 들어 https://www.acmicpc.net/problem/17228이 문제는 정해가 라빈 카프고, KMP로도 풀리긴 하지만 그냥 KMP를 있는 그대로 적용해서는 안 풀립니다. 그러니까 아마 KMP가 안 되는 것도 있지 않을까요.

라빈카프가 본질적으로 확률적으로 동작하고 저격이 꽤 잘 되는 건 맞지만, 사전에 막는 건 쉽지 않습니다. birthday paradox에 안 걸리도록 가능한 해시 값을 많이 하고 데이터 만든 사람이 상상도 못한 베이스를 쓰면 저격당하지 않는 이상 높은 확률로 통과하는 걸로 압니다.

문자열은 저도 잘 몰라서... manacher 알고리즘 정도 생각나네요.

devbelly   3년 전

지금 딱 만영로 KMP로 풀고 있었는데..단순 KMP는 아닌가보군요

답변 감사드립니다 ㅎㅎ

rdd6584   3년 전

질문 1. 라빈카프를 사용해야만 풀리는 문제가 있나요?

라빈카프가 정해인 문제들이 여럿 있습니다만, 다른 풀이로도 풀리는 경우가 거의 대부분이긴 합니다.

질문 2. (질문1과 비슷하지만) 라빈카프로 풀 수 있는 문제는 KMP로 다 풀 수가 있나요?

애초에 라빈카프로 풀 수 있는 문제와 KMP로 풀 수 있는 문제의 공통이 많지 않다고 생각합니다.

질문 3. 위 5개 말고도 공부해두면 좋을 문자열 알고리즘이 더 있나요?
manacher, Z 알고리즘 정도가 있는데, 이 두 알고리즘이 대회에서 자주 등장하는 편은 아닙니다.


그 외의 알고리즘은 제 지식으로는 모르겠습니다.


제가 라빈 카프를 좋아하는 탓도 있지만, 
활용범위가 굉장히 넓고 어려운 문제도 라빈카프로 쉽게 풀리는 경우가 많아서 배워두면 가장 좋은 알고리즘 중 하나라고 생각합니다.

제 경험상 라빈 카프의 저격 데이터는 참가자가 어떤 modular, base를 사용하느냐에 따라 달라지기 때문에 보통 의도적으로 저격하지 않습니다.

 또 저격하는 것이 codeforces 처럼 참가자의 코드를 보고 만들지 않는 이상 거의 불가능합니다만, 종종 TLE 이슈가 있긴 합니다.

devbelly   3년 전

@rdd6584

답변 너무 감사드려요 ㅎㅎ 공부하고 넘어가야겠네용!! ㅎㅎ

dtc03012   3년 전

혹시 ps갤에 글 쓰신 분인가요? ㅋㅋ 

devbelly   3년 전

@dtc03012
헉 어떻게 아셨지 ;; 

dtc03012   3년 전

@devbelly

은근히 시드 두개 해서 풀면 맞을 때가 많아요

devbelly   3년 전

@dtc03012

알고리즘 알려주는 블로그에서는 시드 두개 쓰는 테크닉(?)이라던지 base 선택하는 방법을 자세히 안알려줘서 좀 헤맸는데 다른 형님들이 잘 알려주셔서 
잘 쓰고있습니당 ㅋㄷㅋㄷ ㅎㅎ 댓글 감사드려요 ㅎㅎ

댓글을 작성하려면 로그인해야 합니다.