해시 충돌 문자열
시간 제한2초메모리 제한512 MB
길이 N인 두 문자열을 출력한다. 서로 다르지만 Java String hashCode 값이 같아야 하며, Aa와 BB의 충돌에 같은 접두사를 붙이는 방식을 쓴다.
문제
다음 프로그램에 문자열 두 개를 입력하면, 두 문자열이 서로 다르면서 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는 길이가 인 문자열 에 대해
를 32비트 부호 있는 정수 연산으로 계산한다. 즉 중간 결과는 모두 로 나눈 나머지를 취해 이상 이하의 값으로 되돌린다. 는 그 문자의 아스키 코드다.
길이가 이고 영문 대소문자로만 이루어진 서로 다른 문자열 , 중에서 를 만족하는 쌍을 찾아 출력한다.
입력
첫째 줄에 문자열의 길이 ()이 주어진다.
출력
조건을 만족하는 쌍은 여러 가지이므로, 다음 한 쌍만 정답으로 인정한다.
첫째 줄에 문자열 를 출력한다. 는 대문자 A 개 뒤에 소문자 a 하나를 붙인 문자열이다.
둘째 줄에 문자열 를 출력한다. 는 대문자 A 개 뒤에 대문자 B 두 개를 붙인 문자열이다.
두 문자열은 길이가 모두 이고, 서로 다르며, hashCode 값이 같다.
힌트
"Aa"와 "BB"의 hashCode는 둘 다 2112다. 길이가 같고 해시가 같은 두 문자열 앞에 같은 문자열을 붙여도 해시는 그대로 같다.