输入
输入文件将包含一个文本字符串列表,每行一个。文本字符串将仅包含大写字母数字字符和下划线(用于代替空格)。输入的结束将由仅包含单词“END”作为文本字符串的行发出信号。不应处理此行。
输出
对于输入中的每个文本字符串,输出 8 位 ASCII 编码的比特长度、最佳无前缀可变长度编码的比特长度以及精确到小数点的压缩率。
样例输入
AAAAABCD
THE_CAT_IN_THE_HAT
END
样例输出
64 13 4.9
144 51 2.8
代码如下:
#include
#include
#include
#include
using namespace std;
int a[30];
int main()
{
string s;
while(1)
{
cin >> s;
if(s=="END") break;
memset(a,0,sizeof(a));//每次输入前需要将数据格式化
int n=s.size();
for(int i=0;i,greater >q;//升序的优先队列,使队首元素保证为最小值
for(int i=0;i<=26;i++)
{
if(a[i]) q.push(a[i]);//输入数据
}
int ans=n;
while(q.size()>2)//模拟构建哈夫曼树的操作,具体可以百度
{
int t,t1,t2;
t1=q.top();q.pop();//其构建方法就是每次选择两个最小的合并
t2=q.top();q.pop();//直到合并为一颗树
t=t1+t2;
ans+=t;
q.push(t);
}
printf("%d %d %.1lfn",n*8,ans,(double)n*8/ans);
}
return 0;
}
THE_CAT_IN_THE_HAT
END 样例输出 64 13 4.9
144 51 2.8 代码如下:
#include#include #include #include using namespace std; int a[30]; int main() { string s; while(1) { cin >> s; if(s=="END") break; memset(a,0,sizeof(a));//每次输入前需要将数据格式化 int n=s.size(); for(int i=0;i ,greater >q;//升序的优先队列,使队首元素保证为最小值 for(int i=0;i<=26;i++) { if(a[i]) q.push(a[i]);//输入数据 } int ans=n; while(q.size()>2)//模拟构建哈夫曼树的操作,具体可以百度 { int t,t1,t2; t1=q.top();q.pop();//其构建方法就是每次选择两个最小的合并 t2=q.top();q.pop();//直到合并为一颗树 t=t1+t2; ans+=t; q.push(t); } printf("%d %d %.1lfn",n*8,ans,(double)n*8/ans); } return 0; }
大数据201 ly



