shinbian11   3년 전

pow 함수는 실수에 관련된 작업이라 오래 걸린다고는 대충 알고 있엇는데, hash_val 함수 내부를 밑처럼 구현하면 시간초과가 나는데, pow함수가 오래 걸려서 인가요? 물론 이때 len은 m의 길이입니다.

int ans = 0;
len -= 1;
for (char s : str)
{
ans += (int)(s * pow(base, len)) % mod;
ans %= mod;
len--;
}
return ans;

slah007   3년 전

pow(n, k) mod m 를 lg k 만에 구할 수 있습니다.

shinbian11   3년 전

그럼 얼마 안 걸리는 거 아닌가요? logk 에서 밑이 2고 k가 최대 100만인데, 그럼 20 이하의 값이 나오는데...

그럼 hash_val 함수 내부를 pow로도 구현 가능한가요?

jhnah917   3년 전

mod가 너무 작습니다. mod가 127인 경우 1/127의 확률로 `a.substr(i, m) == b`를 호출하게 됩니다.

평균적으로 `(문자열 길이)^2 / 127` 정도의 연산량을 요구하는데, 문자열의 길이가 최대 100만이기 때문에 TLE가 나기 쉽습니다.

shinbian11   3년 전

감사합니다!

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