[7432]ディスクツリー


import java.util.*;
import java.io.*;

public class Main {
	static StringBuilder sb = new StringBuilder();
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st;
		int N = Integer.parseInt(br.readLine());
		
		//최상위 폴더
		Path root = new Path();
		
		for (int i = 0; i < N; i++) {
			st = new StringTokenizer(br.readLine(), "\\");
			
			//현재 폴더를 담는 변수. 처음엔 root
			Path p = root;
			
			while (st.hasMoreTokens()) {
				//폴더명 가져옴
				String s = st.nextToken();
				
				//만약 s(하위폴더명)가 p(현재폴더)의 하위 폴더에 있을 경우
				if (p.map.containsKey(s)) {
				
					//현재 폴더를 하위 폴더 s로 바꾼다.
					p = p.map.get(s);
				
				} else {
					//새로운 폴더를 생성한다.(새롭게 생성된 폴더에는 하위 폴더가 없다.)
					Path pa = new Path();
					
					//생성한 폴더를 현재 폴더에 넣는다.
					p.map.put(s, pa);
					
					//현재 폴더를 하위 폴더인 pa로 바꾼다.
					p = pa;
				}
			}
		}

		fn(root, "");

		System.out.println(sb);

	}

	//주어진 폴더를 탐색하여 하위 폴더를 순서대로 탐색하고, 탐색한 하위 폴더의 하위 폴더를 다시 탐색하는 재귀 함수.  
	static void fn(Path path, String tap) {

		//현재 폴더에 있는 하위 폴더를 순서대로 탐색한다.
		for (String s : path.map.keySet()) {
		
			//tap(깊이와 동일한 띄어쓰기) + 하위 폴더명 + 한줄띄기
			sb.append(tap).append(s).append("\n");
			
			//하위폴더를 기준으로 탐색
			fn(path.map.get(s), tap + " ");
		}
	}

	//현재 폴더를 의미하며 하위 폴더를 map으로 가지는 객체
	static class Path {
		//map : 1단계 하위 폴더들의 집합
		//TreeMap으로 사전순 정렬
		Map<String, Path> map = new TreeMap<>();

	}
}
この問題は保存された単語の中で重複する単語を探すのではないので、文字で地図を構成しなくても解くことができます.それでもcharacterに設定して解くとさらに時間が短くなります.
(Stringを使用すると、asdf、asdfgが重なる部分asdfが2回回転します.
characterの場合、asdfに移動し、booleanチェックを行うと、booleanステータスにかかわらずサブ文字が検索されるため、asdfは2回もナビゲートされません.)