fork download
  1. #include <iostream>
  2. #include <vector>
  3. #include <queue>
  4.  
  5. int main()
  6. {
  7. using szvec = std::vector<size_t>;
  8. using range = std::pair<szvec::const_iterator,szvec::const_iterator>;
  9.  
  10. const std::vector<szvec> v = {
  11. {4, 10, 12, 18, 20, 28, 34},
  12. {4, 12, 18, 20, 28},
  13. {4, 17, 18, 20, 28},
  14. {4, 17, 18, 20, 28, 37}
  15. };
  16.  
  17. // we use greater so iterator with smallest value will be on top of queue
  18. auto sort_range = []( const range &r1, const range &r2 ) {
  19. return *(r1.first) > *(r2.first);
  20. };
  21. std::priority_queue<range,std::vector<range>,decltype(sort_range)> q( sort_range );
  22.  
  23. for( const auto &vec : v ) q.push( std::make_pair( vec.cbegin(), vec.cend() ) );
  24. std::vector<std::pair<size_t,size_t>> counters;
  25. while( !q.empty() ) {
  26. auto r = q.top();
  27. q.pop();
  28. if( counters.empty() || counters.back().first != *(r.first) )
  29. counters.emplace_back( *(r.first), 1 );
  30. else
  31. counters.back().second++;
  32. if( ++r.first != r.second ) q.push( r );
  33. }
  34.  
  35. for( const auto &p : counters )
  36. std::cout << p.first << ":" << p.second << std::endl;
  37. }
  38.  
Success #stdin #stdout 0s 4320KB
stdin
Standard input is empty
stdout
4:4
10:1
12:2
17:2
18:4
20:4
28:4
34:1
37:1