※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 15829번 문제인 Hashing이다.
문제는 아래 링크를 확인하자.

https://www.acmicpc.net/problem/15829 

 

15829번: Hashing

APC에 온 것을 환영한다. 만약 여러분이 학교에서 자료구조를 수강했다면 해시 함수에 대해 배웠을 것이다. 해시 함수란 임의의 길이의 입력을 받아서 고정된 길이의 출력을 내보내는 함수로 정

www.acmicpc.net

p=31, MOD=1234567891인 롤링 해시(rolling hash)를 구현하는 문제이다.

 

지문에 써져있는 설명을 읽고 그대로 따라 구현해 문제를 해결해주자.

 

(A+B)%C와 ((A%C)+(B%C))%C의 값은 동일하다는 성질을 이용해 정수의 오버플로우를 피할 수 있다.

 

첫 번째 문자의 인덱스가 0임에 유의해 구현하자.

 

아래는 제출한 소스코드이다.

#include <iostream>
#include <string>
using namespace std;
typedef long long ll;

int L;
string s;
ll exp31 = 1;
ll ans = 0;

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);

	cin >> L >> s;
	for (int i = 0; i < L; i++) {
		ans = (ans + exp31 * (s[i] - 'a' + 1)) % 1234567891;
		exp31 = (exp31 * 31) % 1234567891;
	}

	cout << ans;
}
728x90

+ Recent posts