Pagini recente » Cod sursa (job #2927367) | Cod sursa (job #3294350) | Rating Lazar Laurentiu (Lazar_Laurentiu) | Statisticile problemei Toys | Cod sursa (job #3294469)
//package huffman;
import java.io.*;
import java.util.*;
public class Main {
static final String INPUT_FILE = "huffman.in";
static final String OUTPUT_FILE = "huffman.out";
public static class TokenizedReader {
private final BufferedReader reader;
private StringTokenizer tokenizer;
TokenizedReader(String filePath) throws FileNotFoundException {
reader = new BufferedReader(new FileReader(filePath));
}
private String nextToken() {
while (tokenizer == null || !tokenizer.hasMoreTokens()) {
try {
tokenizer = new StringTokenizer(reader.readLine());
} catch (IOException e) {
throw new RuntimeException(e);
}
}
return tokenizer.nextToken();
}
private int nextInt() {
return Integer.parseInt(nextToken());
}
private long nextLong() {
return Long.parseLong(nextToken());
}
public void close() throws IOException {
reader.close();
}
}
public static class HuffmanTree {
private Node root = null;
private List<String> encodings = new ArrayList<>();
public class Node {
long frequency;
Node left;
Node right;
Node(long frequency) {
this.frequency = frequency;
}
public Node(Node left, Node right) {
this.left = left;
this.right = right;
this.frequency = 0L;
if (left != null) {
this.frequency += left.frequency;
}
if (right != null) {
this.frequency += right.frequency;
}
}
}
public HuffmanTree(long[] freq) {
Queue<Node> heap = new PriorityQueue<>(Comparator.comparingLong(n0 -> n0.frequency));
for (long f : freq) {
Node node = new Node(f);
heap.add(node);
}
while (!heap.isEmpty()) {
Node left = heap.poll();
if (heap.isEmpty()) {
root = left;
break;
}
Node right = heap.poll();
Node merged = new Node(left, right);
heap.add(merged);
}
encode(root, "");
encodings.sort(Comparator.comparingInt(String::length));
Collections.reverse(encodings);
}
private void encode(Node node, String mask) {
if (node.left == null && node.right == null) {
encodings.add(mask);
return;
}
encode(node.left, mask + "0");
encode(node.right, mask + "1");
}
}
public static void main(String[] args) throws IOException {
TokenizedReader reader = new TokenizedReader(INPUT_FILE);
PrintWriter writer = new PrintWriter(OUTPUT_FILE);
solve(reader, writer);
reader.close();
writer.flush();
writer.close();
}
public static long binaryToLong(String mask) {
long l = 0L;
for (int i = 0; i < mask.length(); ++i) {
int pos = mask.length() - i - 1;
l |= ((mask.charAt(pos) - '0') << i);
}
return l;
}
public static void solve(TokenizedReader reader,
PrintWriter writer) {
int n = reader.nextInt();
long[] freq = new long[n];
for (int i = 0; i < n; ++i) {
freq[i] = reader.nextLong();
}
HuffmanTree tree = new HuffmanTree(freq);
for (String encoding : tree.encodings) {
writer.println(encoding.length() + " " + binaryToLong(encoding));
}
}
}