아직 만들고 있는 페이지입니다.

이 페이지는 아직 만드는 중입니다. 보이는 내용은 바뀔 수 있습니다.

해시 충돌 문자열

시간 제한2초메모리 제한512 MB

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

쉬움10점 중 2점

유형
문자열, 해시맵, 수학, 구현
정답자
아직 제출이 없습니다

문제

다음 프로그램에 문자열 두 개를 입력하면, 두 문자열이 서로 다르면서 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=s0s1…sn−1s = s_0 s_1 \dots s_{n-1}에 대해

H(s)=s0⋅31n−1+s1⋅31n−2+⋯+sn−2⋅31+sn−1H(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} 이상 231−12^{31}-1 이하의 값으로 되돌린다. sis_i는 그 문자의 아스키 코드다.

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

입력

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

출력

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

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

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

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

힌트

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

예제2

  1. 예제 1

    입력
    2
    
    예상 출력
    Aa
    BB
    
  2. 예제 2

    입력
    3
    
    예상 출력
    AAa
    ABB