結果

問題 No.205 マージして辞書順最小
ユーザー kenkoooo
提出日時 2015-05-08 23:49:20
言語 Java
(openjdk 23)
結果
AC  
実行時間 284 ms / 5,000 ms
コード長 1,519 bytes
コンパイル時間 2,218 ms
コンパイル使用メモリ 77,780 KB
実行使用メモリ 42,480 KB
最終ジャッジ日時 2024-07-05 20:47:53
合計ジャッジ時間 6,022 ms
ジャッジサーバーID
(参考情報)
judge2 / judge1
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 4
other AC * 15
権限があれば一括ダウンロードができます

ソースコード

diff #

import java.util.Arrays;
import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int N = sc.nextInt();
		char[][] list = new char[N][];
		int sum = 0;
		for (int i = 0; i < list.length; i++) {
			list[i] = sc.next().toCharArray();
			sum += list[i].length;
		}
		sc.close();

		int[] curs = new int[N];
		StringBuilder sb = new StringBuilder();
		boolean[] dropped = new boolean[N];
		while (sb.length() < sum) {
			Arrays.fill(dropped, false);

			int k = 0;
			int min = -1;
			while (true) {
				char c = 'z' + 1;
				for (int i = 0; i < list.length; i++) {
					if (dropped[i]) {
						continue;
					}
					if (curs[i] + k >= list[i].length) {
						continue;
					}
					if (c >= list[i][curs[i] + k]) {
						min = i;
						c = list[i][curs[i] + k];
					}
				}
				for (int i = 0; i < list.length; i++) {
					if (dropped[i]) {
						continue;
					}
					if (curs[i] + k >= list[i].length) {
						dropped[i] = true;
						continue;
					}
					if (c < list[i][curs[i] + k]) {
						dropped[i] = true;
					}
				}
				int cnt = 0;
				for (int i = 0; i < list.length; i++) {
					if (!dropped[i]) {
						cnt++;
					}
				}
				if (cnt == 0) {
					break;
				} else if (cnt == 1) {
					for (int i = 0; i < dropped.length; i++) {
						if (!dropped[i]) {
							min = i;
							break;
						}
					}
					break;
				}
				k++;
			}

			sb.append(list[min][curs[min]]);
			curs[min]++;
		}
		System.out.println(sb.toString());

	}
}
0