PAT 数据结构 04-树6. Huffman Codes (30)

来源:互联网 发布:各班级出勤率数据图表 编辑:程序博客网 时间:2024/04/28 22:21

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 a string of '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.

Sample Input:
7A 1 B 1 C 1 D 3 E 3 F 6 G 64A 00000B 00001C 0001D 001E 01F 10G 11A 01010B 01011C 0100D 011E 10F 11G 00A 000B 001C 010D 011E 100F 101G 110A 00000B 00001C 0001D 001E 00F 10G 11
Sample Output:
YesYesNoNo

/*2015.7.12*///06 HuffmanCodes //priority_queue默认最大值在top() ; 排序后用string.substr()判断前缀#include <iostream>#include <queue>#include <string>#include <algorithm>using namespace std;struct code{char ch;int num;};struct ans{char ch;string str;};bool cmp(ans a,ans b){return a.str.size()<b.str.size();}bool f(vector<ans> b){//判断前缀int n=b.size();sort(b.begin(),b.end(),cmp);for(int i=0;i<n;i++){string tmp=b[i].str;for(int j=i+1;j<n;j++)if(b[j].str.substr(0,tmp.size())==tmp)return false;}return true;}int main(){int N;cin>>N;vector<code> a(N);priority_queue<int,vector<int>,greater<int> > q;//改为最小值在顶部for(int i=0;i<N;i++){cin>>a[i].ch>>a[i].num;q.push(a[i].num);}int wpl=0;//带权路径int d,c,m;while(!q.empty()){d=q.top();q.pop();if(q.empty())break;c=q.top();q.pop();m=d+c;q.push(m);wpl+=m;}int K;cin>>K;vector<ans> b(N);while(K--){int len=0;for(int i=0;i<N;i++){cin>>b[i].ch>>b[i].str;len+=b[i].str.size()*a[i].num;}if(len>wpl)//带权路径太大cout<<"No"<<endl;else if(!f(b))//不是前缀码cout<<"No"<<endl;elsecout<<"Yes"<<endl;}return 0;}


0 0
原创粉丝点击