Data Structures and Algorithms (English)
转载地址-所参考的作者
其中scanf函数所踩到的坑
#include<stdio.h>
#include<algorithm>
#include<queue>
#include<string>
#include<map>
#include<iostream>
#include<functional>
using namespace std;
#define MAX 105
int weight;
int n;
struct Character {
char c;
int f;
};
struct HuffmanCode {
char c;
string str;
};
HuffmanCode code[MAX];
Character ch[MAX];
priority_queue<int, vector<int>, greater<int>> q;
map<char, int> hashMap;
void buildTree() {
for (int i = 0; i < n; i++) {
q.push(ch[i].f);
}
while (q.size() >= 2) {
int x = q.top(); q.pop();
int y = q.top(); q.pop();
q.push(x + y);
weight += x + y;
}
q.pop();
}
bool cmp(const HuffmanCode& a, const HuffmanCode& b) {
return a.str.size() < b.str.size();
}
bool isPrefix() {
sort(code, code + n, cmp);
for (int i = 0; i < n; i++) {
string tempStr = code[i].str;
for (int j = i+1; j < n; j++) {
if (tempStr == code[j].str.substr(0, tempStr.size()))
return true;
}
}
return false;
}
int main() {
int m;
scanf("%d", &n);
for (int i = 0; i < n; i++) {
getchar();
scanf("%c %d", &ch[i].c, &ch[i].f);
hashMap[ch[i].c] = ch[i].f;
}
buildTree();
scanf("%d", &m);
for (int i = 0; i < m; i++) {
int stuAns = 0;
for (int j = 0; j < n; j++) {
cin >> code[j].c >> code[j].str;
stuAns += hashMap[ch[j].c] * code[j].str.size();
}
if (stuAns == weight && !isPrefix())
printf("Yes\n");
else
printf("No\n");
}
return 0;
}