- 문제 링크 : boj.kr/15551
- 난이도 : G3
- 태그 : 해싱
15551번: if 3
다음 프로그램을 실행시켰을 때, "true"를 출력하는 길이가 N인 문자열 a, b 를 찾는 프로그램을 작성하시오. import java.util.*; public class Main { public static void main(String args[]) { Scanner sc = new Scanner(System
www.acmicpc.net
코드
#include <bits/stdc++.h>
#define all(x) (x).begin(), (x).end()
#define INF 0x7FFFFFFF
using namespace std;
using ll = long long;
using ld = long double;
using pii = pair<int,int>;
using pll = pair<ll, ll>;
int main()
{
ios::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
int n;
cin >> n;
for(int i = 0; i < n-2; i++) cout << "A";
cout << "Ab\n";
for(int i = 0; i < n-2; i++) cout << "A";
cout << "BC";
return 0;
}
풀이
문제의 핵심은 JAVA의 hashCode가 어떤 값을 반환하는지 아는 것이다. JAVA의 hashCode는 다음 값을 반환한다.
$$\sum_{i=0}^{n-1} {s[i] \times 31^{(n-1)-i}}$$
여기서 주목할 부분은 문자열의 마지막 두 부분이다. 이 부분만 따로 떼어서 보면 다음과 같다.
$$s[n-2] \times 31 + s[n-1]$$
이 값이 서로 같게 되는 두 자리 문자열을 찾으면 된다.
n이 2 이상일 경우 아무 같은 문자열을 각각의 앞에 혹은 뒤에 이어서 붙여주면 된다.
728x90
'PS' 카테고리의 다른 글
BOJ 13422 : 도둑 (0) | 2024.03.26 |
---|---|
BOJ 7775 : 최종 순위 (1) | 2024.03.25 |
BOJ 5430 : AC (0) | 2024.03.23 |
BOJ 7569 : 토마토 (0) | 2024.03.22 |
BOJ 7576 : 토마토 (0) | 2024.03.21 |