请设计一个算法,给一个字符串进行二进制编码,使得编码后字符串的长度最短。
输入描述:
每组数据一行,为待编码的字符串。保证字符串长度小于等于1000。
输出描述:
一行输出最短的编码后长度。
输入例子:
MT-TECH-TEAM
输出例子:
33
#include <iostream>
#include <string>
#include <map>
#include <queue>
#include <algorithm>
using namespace std;
bool cmp(int first,int next){
return first<next;
}
int main(){
string input;
while(cin>>input){
if(input.empty()==true) continue;
map<char,int> m;
for(int i = 0;i<input.size();i++){
++m[input[i]];
}
deque<int> dq;
for(map<char,int>::iterator it=m.begin();it!=m.end();it++){
dq.push_back((*it).second);
}
stable_sort(dq.begin(),dq.end(),cmp);
int result =0;
while(dq.size()>1){
int first = dq.front();
dq.pop_front();
int next = dq.front();
dq.pop_front();
result+=first+next;
dq.push_back(first+next);
stable_sort(dq.begin(),dq.end(),cmp);
}
cout<<result<<endl;
}
return 0;
}