/* package whatever; // don't place package name! */
import java.util.*;
/**
* Created by mac on 12.11.15.
*/
public class Main {
public static void main
(String[] args
) { Scanner in
= new Scanner
(System.
in);
Map
<String,Integer
> map
= new HashMap
<>(); String string
= in.
nextLine(); int value;
for (int i = 0; i < string.length(); i++) {
key = "" + string.charAt(i);
if (map.containsKey(key)) {
value = map.get(key) + 1; // получение значения по ключу те частоту
map.put(key,value);
} else {
map.put(key,1);
}
}
List
<Map.
Entry<String, Integer
>> list
= new ArrayList
<>(map.
entrySet()); List<Element> q = new ArrayList<>();
for (int i = 0; i < list.size(); i ++) {
q.
add(new Element(list.
get(i
).
getValue(), list.
get(i
).
getKey())); }
@Override
return one.p-two.p;
}
};
int dl = list.size();
if (list.size() == 1) {
System.
out.
println(1 + " " + string.
length()); System.
out.
println(string.
charAt(0) + ": " + "0"); for (int i = 0; i < string.length(); i++) {
simplecode += "0";
}
System.
out.
println(simplecode
); } else {
do {
buffer1 = extractMin(q);
buffer2 = extractMin(q);
// добавляем элемент с именем сум двух мин элементов и приоритетом сум двух мин элементов
insertElement
(q,
new Element(buffer1.
p + buffer2.
p, buffer1.
v + buffer2.
v, buffer1, buffer2
)); } while (q.size() > 1);
// получаем код 'a'
Map
<String, String
> dictionary
= new HashMap
<>();
for (int i = 0; i < q.get(0).v.length(); i++) {
String symbol
= "" + q.
get(0).
v.
charAt(i
); while ((buffCoding.leftchild != null) && (buffCoding.rightchild != null)) {
if (buffCoding.leftchild.v.contains(symbol)) {
code += "0";
buffCoding = buffCoding.leftchild;
} else if (buffCoding.rightchild.v.contains(symbol)) {
code += "1";
buffCoding = buffCoding.rightchild;
}
}
dictionary.put(symbol, code);
halfresult[i] = (symbol + ": " + code);
}
for (int i = 0; i < string.length(); i++) {
key = "" + string.charAt(i);
resultCode += dictionary.get(key);
}
System.
out.
println(list.
size() + " " + resultCode.
length());
for (int i = 0; i < halfresult.length; i ++) {
System.
out.
println(halfresult
[i
]); }
System.
out.
println(resultCode
); }
}
int p;
this.p = p;
this.v = v;
}
this.p = p;
this.v = v;
this.leftchild = leftchild;
this.rightchild = rightchild;
}
}
public static Element extractMin
(List
<Element
> q
) { for (int i = 1; i < q.size(); i++) {
q.set(i-1,q.get(i));
}
q.remove(q.size()-1);
return buffer;
}
public static void insertElement
(List
<Element
> q,
Element el
) { if (q.size() == 0) {
q.add(el);
return;
}
for (int i = q.size()-1; i >= 0; i--) {
if (el.p >= q.get(i).p) {
q.add(i+1,el);
break;
}
}
}
}
LyogcGFja2FnZSB3aGF0ZXZlcjsgLy8gZG9uJ3QgcGxhY2UgcGFja2FnZSBuYW1lISAqLwoKaW1wb3J0IGphdmEudXRpbC4qOwoKLyoqCiAqIENyZWF0ZWQgYnkgbWFjIG9uIDEyLjExLjE1LgogKi8KcHVibGljIGNsYXNzIE1haW4gewogICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewogICAgICAgIFNjYW5uZXIgaW4gPSBuZXcgU2Nhbm5lcihTeXN0ZW0uaW4pOwoKICAgICAgICBNYXA8U3RyaW5nLEludGVnZXI+IG1hcCA9IG5ldyBIYXNoTWFwPD4oKTsKICAgICAgICBTdHJpbmcgc3RyaW5nID0gaW4ubmV4dExpbmUoKTsKICAgICAgICBpbnQgdmFsdWU7CiAgICAgICAgU3RyaW5nIGtleTsKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHN0cmluZy5sZW5ndGgoKTsgaSsrKSB7CiAgICAgICAgICAgIGtleSA9ICIiICsgc3RyaW5nLmNoYXJBdChpKTsKICAgICAgICAgICAgaWYgKG1hcC5jb250YWluc0tleShrZXkpKSB7CiAgICAgICAgICAgICAgICB2YWx1ZSA9IG1hcC5nZXQoa2V5KSArIDE7IC8vINC/0L7Qu9GD0YfQtdC90LjQtSDQt9C90LDRh9C10L3QuNGPINC/0L4g0LrQu9GO0YfRgyDRgtC1INGH0LDRgdGC0L7RgtGDCiAgICAgICAgICAgICAgICBtYXAucHV0KGtleSx2YWx1ZSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBtYXAucHV0KGtleSwxKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBMaXN0PE1hcC5FbnRyeTxTdHJpbmcsIEludGVnZXI+PiBsaXN0ID0gbmV3IEFycmF5TGlzdDw+KG1hcC5lbnRyeVNldCgpKTsKICAgICAgICBMaXN0PEVsZW1lbnQ+IHEgPSBuZXcgQXJyYXlMaXN0PD4oKTsKCiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0LnNpemUoKTsgaSArKykgewogICAgICAgICAgICBxLmFkZChuZXcgRWxlbWVudChsaXN0LmdldChpKS5nZXRWYWx1ZSgpLCBsaXN0LmdldChpKS5nZXRLZXkoKSkpOwogICAgICAgIH0KCiAgICAgICAgQ29tcGFyYXRvciBjb21wYXJhdG9yID0gbmV3IENvbXBhcmF0b3IoKSB7CiAgICAgICAgICAgIEBPdmVycmlkZQogICAgICAgICAgICBwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IG8xLCBPYmplY3QgbzIpIHsKICAgICAgICAgICAgICAgIEVsZW1lbnQgb25lID0gKEVsZW1lbnQpIG8xOwogICAgICAgICAgICAgICAgRWxlbWVudCB0d28gPSAoRWxlbWVudCkgbzI7CiAgICAgICAgICAgICAgICByZXR1cm4gb25lLnAtdHdvLnA7CiAgICAgICAgICAgIH0KICAgICAgICB9OwoKICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KHEsY29tcGFyYXRvcik7CiAgICAgICAgaW50IGRsID0gbGlzdC5zaXplKCk7CiAgICAgICAgRWxlbWVudCBidWZmZXIxOwogICAgICAgIEVsZW1lbnQgYnVmZmVyMjsKCiAgICAgICAgaWYgKGxpc3Quc2l6ZSgpID09IDEpIHsKICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKDEgKyAiICIgKyBzdHJpbmcubGVuZ3RoKCkpOwogICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oc3RyaW5nLmNoYXJBdCgwKSArICI6ICIgKyAiMCIpOwogICAgICAgICAgICBTdHJpbmcgc2ltcGxlY29kZSA9ICIiOwogICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHN0cmluZy5sZW5ndGgoKTsgaSsrKSB7CiAgICAgICAgICAgICAgICBzaW1wbGVjb2RlICs9ICIwIjsKICAgICAgICAgICAgfQogICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oc2ltcGxlY29kZSk7CiAgICAgICAgfSBlbHNlIHsKCiAgICAgICAgICAgIGRvIHsKICAgICAgICAgICAgICAgIGJ1ZmZlcjEgPSBleHRyYWN0TWluKHEpOwogICAgICAgICAgICAgICAgYnVmZmVyMiA9IGV4dHJhY3RNaW4ocSk7CiAgICAgICAgICAgICAgICAvLyDQtNC+0LHQsNCy0LvRj9C10Lwg0Y3Qu9C10LzQtdC90YIg0YEg0LjQvNC10L3QtdC8INGB0YPQvCDQtNCy0YPRhSDQvNC40L0g0Y3Qu9C10LzQtdC90YLQvtCyINC4INC/0YDQuNC+0YDQuNGC0LXRgtC+0Lwg0YHRg9C8INC00LLRg9GFINC80LjQvSDRjdC70LXQvNC10L3RgtC+0LIKICAgICAgICAgICAgICAgIGluc2VydEVsZW1lbnQocSwgbmV3IEVsZW1lbnQoYnVmZmVyMS5wICsgYnVmZmVyMi5wLCBidWZmZXIxLnYgKyBidWZmZXIyLnYsIGJ1ZmZlcjEsIGJ1ZmZlcjIpKTsKICAgICAgICAgICAgfSB3aGlsZSAocS5zaXplKCkgPiAxKTsKCiAgICAgICAgICAgIC8vINC/0L7Qu9GD0YfQsNC10Lwg0LrQvtC0ICdhJwoKCiAgICAgICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gZGljdGlvbmFyeSA9IG5ldyBIYXNoTWFwPD4oKTsKCiAgICAgICAgICAgIFN0cmluZ1tdIGhhbGZyZXN1bHQgPSBuZXcgU3RyaW5nW3EuZ2V0KDApLnYubGVuZ3RoKCldOwoKCiAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcS5nZXQoMCkudi5sZW5ndGgoKTsgaSsrKSB7CiAgICAgICAgICAgICAgICBTdHJpbmcgY29kZSA9ICIiOwogICAgICAgICAgICAgICAgU3RyaW5nIHN5bWJvbCA9ICIiICsgcS5nZXQoMCkudi5jaGFyQXQoaSk7CiAgICAgICAgICAgICAgICBFbGVtZW50IGJ1ZmZDb2RpbmcgPSBxLmdldCgwKTsKICAgICAgICAgICAgICAgIHdoaWxlICgoYnVmZkNvZGluZy5sZWZ0Y2hpbGQgIT0gbnVsbCkgJiYgKGJ1ZmZDb2RpbmcucmlnaHRjaGlsZCAhPSBudWxsKSkgewogICAgICAgICAgICAgICAgICAgIGlmIChidWZmQ29kaW5nLmxlZnRjaGlsZC52LmNvbnRhaW5zKHN5bWJvbCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29kZSArPSAiMCI7CiAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZDb2RpbmcgPSBidWZmQ29kaW5nLmxlZnRjaGlsZDsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGJ1ZmZDb2RpbmcucmlnaHRjaGlsZC52LmNvbnRhaW5zKHN5bWJvbCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29kZSArPSAiMSI7CiAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZDb2RpbmcgPSBidWZmQ29kaW5nLnJpZ2h0Y2hpbGQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZGljdGlvbmFyeS5wdXQoc3ltYm9sLCBjb2RlKTsKICAgICAgICAgICAgICAgIGhhbGZyZXN1bHRbaV0gPSAoc3ltYm9sICsgIjogIiArIGNvZGUpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBTdHJpbmcgcmVzdWx0Q29kZSA9ICIiOwogICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHN0cmluZy5sZW5ndGgoKTsgaSsrKSB7CiAgICAgICAgICAgICAgICBrZXkgPSAiIiArIHN0cmluZy5jaGFyQXQoaSk7CiAgICAgICAgICAgICAgICByZXN1bHRDb2RlICs9IGRpY3Rpb25hcnkuZ2V0KGtleSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihsaXN0LnNpemUoKSArICIgIiArIHJlc3VsdENvZGUubGVuZ3RoKCkpOwoKICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBoYWxmcmVzdWx0Lmxlbmd0aDsgaSArKykgewogICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGhhbGZyZXN1bHRbaV0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihyZXN1bHRDb2RlKTsKICAgICAgICB9CiAgICB9CgoKICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRWxlbWVudHsKICAgICAgICBpbnQgcDsKICAgICAgICBTdHJpbmcgdjsKICAgICAgICBFbGVtZW50IGxlZnRjaGlsZCA9IG51bGw7CiAgICAgICAgRWxlbWVudCByaWdodGNoaWxkID0gbnVsbDsKICAgICAgICBwdWJsaWMgRWxlbWVudChpbnQgcCwgU3RyaW5nIHYpIHsKICAgICAgICAgICAgdGhpcy5wID0gcDsKICAgICAgICAgICAgdGhpcy52ID0gdjsKICAgICAgICB9CgogICAgICAgIHB1YmxpYyBFbGVtZW50KGludCBwLCBTdHJpbmcgdiwgRWxlbWVudCBsZWZ0Y2hpbGQsIEVsZW1lbnQgcmlnaHRjaGlsZCkgewogICAgICAgICAgICB0aGlzLnAgPSBwOwogICAgICAgICAgICB0aGlzLnYgPSB2OwogICAgICAgICAgICB0aGlzLmxlZnRjaGlsZCA9IGxlZnRjaGlsZDsKICAgICAgICAgICAgdGhpcy5yaWdodGNoaWxkID0gcmlnaHRjaGlsZDsKICAgICAgICB9CgogICAgfQoKICAgIHB1YmxpYyBzdGF0aWMgRWxlbWVudCBleHRyYWN0TWluKExpc3Q8RWxlbWVudD4gcSkgewogICAgICAgIEVsZW1lbnQgYnVmZmVyID0gcS5nZXQoMCk7CiAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBxLnNpemUoKTsgaSsrKSB7CiAgICAgICAgICAgIHEuc2V0KGktMSxxLmdldChpKSk7CiAgICAgICAgfQogICAgICAgIHEucmVtb3ZlKHEuc2l6ZSgpLTEpOwogICAgICAgIHJldHVybiBidWZmZXI7CiAgICB9CgogICAgcHVibGljIHN0YXRpYyB2b2lkIGluc2VydEVsZW1lbnQoTGlzdDxFbGVtZW50PiBxLCBFbGVtZW50IGVsKSB7CiAgICAgICAgaWYgKHEuc2l6ZSgpID09IDApIHsKICAgICAgICAgICAgcS5hZGQoZWwpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGZvciAoaW50IGkgPSBxLnNpemUoKS0xOyBpID49IDA7IGktLSkgewogICAgICAgICAgICBpZiAoZWwucCA+PSBxLmdldChpKS5wKSB7CiAgICAgICAgICAgICAgICBxLmFkZChpKzEsZWwpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgoKfQ==