- #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
- {
- if(s[i]=='_') a[26]++;//判断是否为空格
- else a[s[i]-'A']++;
- }
- priority_queue<int,vector<int>,greater<int> >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 %.1lf\n",n*8,ans,(double)n*8/ans);
- }
- return 0;
- }
大数据201 ly