※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 26640번 문제인 Palindrom이다.
문제는 아래 링크를 확인하자.
https://www.acmicpc.net/problem/26640
26640번: Palindrom
C++17, C11, C99, C++98, C++11, C++14, C++20, C99 (Clang), C++98 (Clang), C++11 (Clang), C++14 (Clang), C11 (Clang), C++17 (Clang), C++20 (Clang), C90, C2x, C90 (Clang), C2x (Clang)
www.acmicpc.net
주어진 문자열의 롤링해시값과 역순 롤링해시값을 구해 둘이 일치한다면 두 문자열을 같은 것으로, 일치하지 않는다면 서로 다른 것으로 생각해 문제를 해결하자.
롤링해시를 한 가지 소수가 아닌 복수의 소수들로 계산해 서로 다른 값의 해시값 충돌로 틀릴 확률을 줄일 수 있다.
아래는 제출한 소스코드이다.
#define MOD 1000000007
#include <iostream>
using namespace std;
typedef long long ll;
int N;
ll val1[10];
ll val2[10];
char c;
ll p[10] = { 127,131,137,139,149,151,157,163,167,173 }, pp[10] = { 1,1,1,1,1,1,1,1,1,1 };
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> N;
while (cin >> c) {
for (int k = 0; k < 10; k++) {
val1[k] = (val1[k] * p[k] + c) % MOD;
val2[k] = (val2[k] + c * pp[k]) % MOD;
pp[k] = pp[k] * p[k] % MOD;
}
}
bool chk = 1;
for (int k = 0; k < 10; k++) {
if (val1[k] != val2[k]) chk = 0;
}
if (chk) cout << "TAK";
else cout << "NIE";
}
728x90
'BOJ' 카테고리의 다른 글
[BOJ 26740 // C++] Nawiasowania (0) | 2023.07.23 |
---|---|
[BOJ 21772 // C++] 가희의 고구마 먹방 (0) | 2023.07.22 |
[BOJ 26660 // C++] A + B (0) | 2023.07.20 |
[BOJ 2275 // C++] 트리의 높이 줄이기 (0) | 2023.07.19 |
[BOJ 2379 // C++] 트리 탐색하기 (0) | 2023.07.18 |