《哈夫曼编码》hdu acm 5.2.8 huffman编码

#include<cstdio>  
#include<cstring>  
#include<set>  
using namespace std; int haffman(char *x) { int len = strlen(x); int i, t, sum, cnt[26];
	multiset<int>m;
	memset(cnt, 0, sizeof(cnt)); for (i = 0;i<len;i++) {
		t = x[i] - 'a';
		cnt[t]++; } for (i = 0;i<26;i++) { if (cnt[i]) {
			m.insert(cnt[i]); } } if (m.size() == 1) { return *m.begin(); } else {
		sum = 0; while (m.size()>1) {
			t = 0; for (i = 0;i<2;i++) {
				t += *m.begin();
				m.erase(m.begin()); }
			m.insert(t);
			sum += t; } return sum; } } int main() { int cas, n;
	scanf("%d", &cas); while (cas--) { char s[1000];
		scanf("%d%s", &n, s); if (haffman(s)>n)
			printf("no\n"); else
			printf("yes\n"); } return 0; }

你可能感兴趣的:(《哈夫曼编码》hdu acm 5.2.8 huffman编码)