[PTA] Huffman Codes

部署运行你感兴趣的模型镜像

       

#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>ma;

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 str = code[i].str;
		for (int j = i + 1; j < n; j++) {
			if (code[j].str.substr(0, str.size()) == str)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);
		ma[ch[i].c] = ch[i].f;
	}
	buildTree();
	scanf("%d", &m);
	while (m--){
		int ans = 0;
		for (int i = 0; i < n; i++) {
			cin >> code[i].c >> code[i].str;
			ans += ma[code[i].c] * code[i].str.size();
		}
		if (ans != weight)printf("No\n");
		else if (isPrefix())printf("No\n");	
		else printf("Yes\n");
	}
	return 0;
}


您可能感兴趣的与本文相关的镜像

ACE-Step

ACE-Step

音乐合成
ACE-Step

ACE-Step是由中国团队阶跃星辰(StepFun)与ACE Studio联手打造的开源音乐生成模型。 它拥有3.5B参数量,支持快速高质量生成、强可控性和易于拓展的特点。 最厉害的是,它可以生成多种语言的歌曲,包括但不限于中文、英文、日文等19种语言

Huffman编码是一种用于数据压缩的算法,也是PTA(浙江大学计算机程序设计能力考试)中的一道C语言题目。Huffman编码通过将出现频率较高的字符用较短的编码表示,而低频字符用较长编码表示,从而实现对文本数据的高效压缩。 编写Huffman编码的C语言程序可以分为以下几个步骤: 1. 定义一个结构体来表示字符及其出现频率的信息,包括字符本身和频率。 2. 统计待压缩文本中各个字符的频率。可以使用一个数组来记录每个字符的出现次数。 3. 构建Huffman树。首先将每个字符及其频率作为独立的树节点,然后根据频率将节点从小到大排序。从中选取频率最小的两个节点,合并为一个新节点,并赋予其频率为两个节点频率之和。重复该步骤,直到只剩下一个根节点,即为Huffman树的根。 4. 根据Huffman树生成每个字符的编码。从根节点开始,向左走为0,向右走为1,将每个字符的编码存储在一个编码表中。 5. 对原始文本进行编码。读取文本中的每个字符,根据编码表找到对应的编码,将其写入输出文件。 6. 对压缩后的文本进行解码。读取编码后的文本,从Huffman树的根节点开始,根据每个字符对应的编码,不断向下搜索树,直到找到叶子节点,即为原始字符。 总的来说,编写Huffman编码的C语言程序需要对字符频率的统计、Huffman树的构建、编码表的生成以及编码和解码等过程进行实现。这是一个较为复杂的问题,需要细致地设计算法和数据结构来完成。
评论 7
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值