标签:长度 orm tor symbol ++ readline ril input decode
In 1953, David A. Huffman published his paper "A Method for the Construction of Minimum-Redundancy Codes", and hence printed his name in the history of computer science. As a professor who gives the final exam problem on Huffman codes, I am encountering a big problem: the Huffman codes are NOT unique. For example, given a string "aaaxuaxz", we can observe that the frequencies of the characters ‘a‘, ‘x‘, ‘u‘ and ‘z‘ are 4, 2, 1 and 1, respectively. We may either encode the symbols as {‘a‘=0, ‘x‘=10, ‘u‘=110, ‘z‘=111}, or in another way as {‘a‘=1, ‘x‘=01, ‘u‘=001, ‘z‘=000}, both compress the string into 14 bits. Another set of code can be given as {‘a‘=0, ‘x‘=11, ‘u‘=100, ‘z‘=101}, but {‘a‘=0, ‘x‘=01, ‘u‘=011, ‘z‘=001} is NOT correct since "aaaxuaxz" and "aazuaxax" can both be decoded from the code 00001011001001. The students are submitting all kinds of codes, and I need a computer program to help me determine which ones are correct and which ones are not.
Each input file contains one test case. For each case, the first line gives an integer N (2≤N≤63), then followed by a line that contains all the N distinct characters and their frequencies in the following format:
c[1] f[1] c[2] f[2] ... c[N] f[N]
where c[i]
is a character chosen from {‘0‘ - ‘9‘, ‘a‘ - ‘z‘, ‘A‘ - ‘Z‘, ‘_‘}, and f[i]
is the frequency of c[i]
and is an integer no more than 1000. The next line gives a positive integer M (≤1000), then followed by M student submissions. Each student submission consists of N lines, each in the format:
c[i] code[i]
where c[i]
is the i
-th character and code[i]
is an non-empty string of no more than 63 ‘0‘s and ‘1‘s.
For each test case, print in each line either "Yes" if the student‘s submission is correct, or "No" if not.
Note: The optimal solution is not necessarily generated by Huffman algorithm. Any prefix code with code length being optimal is considered correct.
7
A 1 B 1 C 1 D 3 E 3 F 6 G 6
4
A 00000
B 00001
C 0001
D 001
E 01
F 10
G 11
A 01010
B 01011
C 0100
D 011
E 10
F 11
G 00
A 000
B 001
C 010
D 011
E 100
F 101
G 110
A 00000
B 00001
C 0001
D 001
E 00
F 10
G 11
Yes Yes No No
对方提供的这行数据
A 1 B 1 C 1 D 3 E 3 F 6 G 6
没用到.
思路
示例3的情况
最后一层,编码长度相同(最大)的叶节点 只能是双数.
他们的上一层,父节点数量 是 这一层子节点的数量除以2.此时, 父节点的数量和 这一层的叶节点的和,也是双数.
也就是说,父节点,要么没有子节点,要么就必须两个子节点
示例4的情况
就是混淆的那种,以谁开头的事儿.
另外
编码的字符是双数个,而提交采用的是等长编码。卡仅判断叶结点和度的错误算法
这一项没有通过.我也不理解啥意思,么法改代码.
using System; using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; using System.Diagnostics; using System.Net; using System.Text; using System.Xml; class T { public class MyItem { public string Value; public string Letter; public int valueLen; } static void Main(string[] args) { List<MyItem> list = new List<MyItem>(); var count = int.Parse(Console.ReadLine()); var line = Console.ReadLine().Split(‘ ‘); for (int i = 0; i < line.Length; i++) { list.Add(new MyItem() { Letter = line[i++], Value = line[i] }); } var testCount = int.Parse(Console.ReadLine()); for (int i = 0; i < testCount; i++) { List<MyItem> testList = new List<MyItem>(); for (int j = 0; j < count; j++) { var tempLine = Console.ReadLine().Split(‘ ‘); testList.Add(new MyItem() { Letter = tempLine[0], Value = tempLine[1], valueLen = tempLine[1].Length }); } if (检查(testList)) { Console.WriteLine("Yes"); } else { Console.WriteLine("No"); } } } //public class Node //{ // public Node Left; // public Node right; //} private static bool 检查(List<MyItem> testList) { int maxLen = 0; int minLen = int.MaxValue; foreach (var item in testList) { if (maxLen< item.valueLen) { maxLen = item.valueLen; } if(minLen>item.valueLen) { minLen = item.valueLen; } } int point=0; for(int i=maxLen;i>=minLen;i--) { var items = testList.FindAll(e => e.valueLen == i); point += items.Count; if(point%2==1) { return false; } else { point = point / 2; } } if (testList.Count < 10) { //糊弄的地方,这种循环最大N&M超时.但是去掉的此处代码的话,最大N&M可以通过.可以通过这种方式取巧通过. testList.Sort((a, b) => a.valueLen < b.valueLen ? -1 : 1); for (int i = 0; i < testList.Count; i++) { for (int j = i + 1; j < testList.Count; j++) { if (testList[j].valueLen >= testList[i].valueLen) { if (testList[j].Value.StartsWith(testList[i].Value)) { return false; } } } } } return true; } }
标签:长度 orm tor symbol ++ readline ril input decode
原文地址:https://www.cnblogs.com/interim/p/9746203.html