First, try to guess where each letter instance would be, only considering one letter at a time. If there's 10 total, and 3as, try to place the As at index 0, 3, and 7. Calculate these estimated indecies for each letter, and put them in a ordered multiset.
std::multimap<unsigned,char> set;
const unsigned totalcount = ... //for your example this would be 10
for (const auto& letterpair : letters) {
unsigned lettercount = letterpair.second; //for c this would be 3
for(unsigned i=0; i<lettercount; ++i) {
unsigned targetIdx = (2*i*totalcount+1)/lettercount;
set.insert(std::make_pair(targetIdx, letterpair.first));
}
}
Then we can simply iterate over the set in order and place each thing in a single index.
std::vector<char> result;
for(const auto& p : set)
result.push_back(p.second); //insert the letters in order
It's not perfect, but it works pretty darn well considering the speed and simplicity.
For your inputs, it results in bcdadcbdcd: http://coliru.stacked-crooked.com/a/1f83ae4518b7c6ca