05-树9 Huffman Codes (30 分)

05-树9 Huffman Codes (30 分)

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.

Input Specification:

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.

Output Specification:

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.

Sample Input:

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

Sample Output:

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;

    }
}

  

原文地址:https://www.cnblogs.com/interim/p/9746203.html

时间: 2024-08-29 00:54:22

05-树9 Huffman Codes (30 分)的相关文章

pta5-9 Huffman Codes (30分)

5-9 Huffman Codes   (30分) 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 o

04-树6. Huffman Codes (30)

04-树6. Huffman Codes (30) 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 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

Pat 04-树6. Huffman Codes (30)

题目链接: Huffman codes 题意: 先给出N个节点的出现次数 再给出M种编码方式 判断每种编码方式是否能构成哈夫曼树 题解: 判断哈夫曼编码的条件有两个: 1  哈夫曼编码不唯一,但它的WPL(带权路径长度)一定唯一 2  短码不能是长码的前缀 首先可以使用STL优先队列 根据  WPL=所有非叶节点的权值之和   求出标准的WPL1 再根据WPL2=所有叶节点的高度*权值之和 再单独判断是否编码中构成前缀 两个条件都满足则输出Yes #include<iostream> #inc

1127 ZigZagging on a Tree (30 分)树的层次遍历

1127 ZigZagging on a Tree (30 分) Suppose that all the keys in a binary tree are distinct positive integers. A unique binary tree can be determined by a given pair of postorder and inorder traversal sequences. And it is a simple standard routine to pr

PAT 甲级1057 Stack (30 分)(不会,树状数组+二分)*****

1057 Stack (30 分) Stack is one of the most fundamental data structures, which is based on the principle of Last In First Out (LIFO). The basic operations include Push (inserting an element onto the top position) and Pop (deleting the top element). No

PTA 1004 Counting Leaves (30)(30 分)(建树dfs或者bfs,未AC 段错误)

1004 Counting Leaves (30)(30 分) A family hierarchy is usually presented by a pedigree tree. Your job is to count those family members who have no child. Input Each input file contains one test case. Each case starts with a line containing 0 < N < 10

PTA Huffman Codes

题目重现 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

04-3. Huffman Codes (PAT) - 哈弗曼编码问题

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 enco

PAT Huffman Codes

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 enc