해시 충돌 문자열

길이 N인 두 문자열을 출력한다. 서로 다르지만 Java String hashCode 값이 같아야 하며, Aa와 BB의 충돌에 같은 접두사를 붙이는 방식을 쓴다.

쉬움2문자열해시맵수학구현아직 제출이 없습니다시간 제한2초메모리 제한512 MB

문제

다음 프로그램에 문자열 두 개를 입력하면, 두 문자열이 서로 다르면서 hashCode 값이 같을 때만 "true"를 출력한다.

import java.util.*;

public class Main {
    public static void main(String args[]) {
        Scanner sc = new Scanner(System.in);
        String a = sc.next();
        String b = sc.next();
        if (!a.equals(b) && a.hashCode() == b.hashCode()) {
            System.out.println("true");
        } else {
            System.out.println("false");
        }
    }
}

java.lang.String.hashCode는 길이가 nn인 문자열 s=s0s1sn1s = s_0 s_1 \dots s_{n-1}에 대해

H(s)=s031n1+s131n2++sn231+sn1H(s) = s_0 \cdot 31^{n-1} + s_1 \cdot 31^{n-2} + \dots + s_{n-2} \cdot 31 + s_{n-1}

를 32비트 부호 있는 정수 연산으로 계산한다. 즉 중간 결과는 모두 2322^{32}로 나눈 나머지를 취해 231-2^{31} 이상 23112^{31}-1 이하의 값으로 되돌린다. sis_i는 그 문자의 아스키 코드다.

길이가 NN이고 영문 대소문자로만 이루어진 서로 다른 문자열 aa, bb 중에서 H(a)=H(b)H(a) = H(b)를 만족하는 쌍을 찾아 출력한다.

입력

첫째 줄에 문자열의 길이 NN (2N1002 \le N \le 100)이 주어진다.

출력

조건을 만족하는 쌍은 여러 가지이므로, 다음 한 쌍만 정답으로 인정한다.

첫째 줄에 문자열 aa를 출력한다. aa는 대문자 A N1N-1개 뒤에 소문자 a 하나를 붙인 문자열이다.

둘째 줄에 문자열 bb를 출력한다. bb는 대문자 A N2N-2개 뒤에 대문자 B 두 개를 붙인 문자열이다.

두 문자열은 길이가 모두 NN이고, 서로 다르며, hashCode 값이 같다.

힌트

"Aa""BB"hashCode는 둘 다 2112다. 길이가 같고 해시가 같은 두 문자열 앞에 같은 문자열을 붙여도 해시는 그대로 같다.