본문 바로가기

코드포스

[Codeforces Round #784 (Div. 4)] E. 2-Letter Strings

 


※. a ~ k (0 ~ 15) 의 배열을 만든다.(배열을 두 개 만들어도 되고 이중배열로 만들어도 됨)

※. 문자를 하나 받을 때 마다 해당 문자의 아스키 코드 -  'a'의 아스키 코드를 증가시켜준다

    (첫번째 글자의 배열 증가, 두번째 글자의 배열 증가를 같이 해줘야함)

※. 같은 문자가 있었다면 같은 문자가 나온 횟수(sub) 를 저장해준다.

※. 받은 문자의 (첫번째 글자가 나온 횟수 - sub) + (두번째 글자가 나온 횟수 - sub)를 해준다.

※. 정수 타입에 주의한다. long (N이 10만 -> aa가 5만 ab가 5만이라면 25억으로 int를 초과)

 


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashMap;

public class Main {
 	public static void main(String arg[]) throws IOException {
 		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
 		StringBuilder sb = new StringBuilder();
 		int T = Integer.parseInt(br.readLine());
 		while(T --> 0) {
 			int N = Integer.parseInt(br.readLine());
 			HashMap<String, Integer> hashmap = new HashMap<>();
 			long result = 0;
 			int[][] letter = new int[16][2]; // 0 front 1 behind
  			for(int i = 0; i < N; i++) {
 				String str = br.readLine();
 				int front = str.charAt(0) - 'a';
 				int behind = str.charAt(1) - 'a';
 				int sub = 0;
 				if(hashmap.containsKey(str)) {
 					int temp = hashmap.get(str);
 					sub = temp;
 					hashmap.put(str, temp+1);
 				}
 				else {
 					hashmap.put(str, 1);
 				}
 				result += letter[front][0] - sub;
 				result += letter[behind][1] - sub;
 				letter[front][0]++;
 				letter[behind][1]++;
 			}
  			sb.append(result).append('\n');
 		}
 		System.out.println(sb);
 	}
}