import java.io.InputStreamReader;
import java.io.Reader;
import java.io.StreamTokenizer;
import java.util.Collections;
import java.util.Enumeration;
import java.util.Hashtable;
import java.util.Vector;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;

public class CharCounter {
	public static void main(String[] args) throws Exception {
		Hashtable<Character, Count> counts = new Hashtable<Character, Count>();
		ZipFile file = new ZipFile(args[0]);
		Enumeration<? extends ZipEntry> entries = file.entries();
		while (entries.hasMoreElements()) {
			ZipEntry entry = entries.nextElement();
			if (!entry.getName().endsWith(".java")) continue;
			Reader src = new InputStreamReader(file.getInputStream(entry));
			StreamTokenizer tokenizer = new StreamTokenizer(src);
			tokenizer.resetSyntax();
			tokenizer.slashSlashComments(true);
			tokenizer.slashStarComments(true);
			while (tokenizer.nextToken() != StreamTokenizer.TT_EOF) {
				if (tokenizer.ttype == StreamTokenizer.TT_EOL) continue;
				char c = (char)tokenizer.ttype;
				Count count = counts.get(c);
				if (count == null) {
					count = new Count(c);
					counts.put(c, count);
				}
				count.n++;
			}
		}
		Vector<Count> ranking = new Vector<Count>();
		ranking.addAll(counts.values());
		Collections.sort(ranking);
		for (int i = 0; i < ranking.size(); i++) {
			System.out.println(ranking.get(i));
		}
	}
	static class Count implements Comparable<Count> {
		char c;
		int n = 0;
		Count(char c) {
			this.c = c;
		}
		public int compareTo(Count o) {
			return (o.n == this.n)? 0 : (o.n < this.n)? -1 : 1;
		}
		public String toString() {
			if (c < ' ') {
				return String.format("\\u%04x", (int)c) + "\t" + n;
			}
			return "'" + c + "'\t" + n;
		}
	}
}
