Advertisement
Korotkodul

LSD_v2

Oct 2nd, 2023 (edited)
1,007
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.44 KB | None | 0 0
  1. #include <cmath>
  2. #include <iostream>
  3. #include <vector>
  4.  
  5. using std::cin;
  6. using std::cout;
  7. using std::max;
  8. using std::min;
  9. using std::string;
  10. using std::vector;
  11. using Ll = long long;
  12.  
  13. const int k20 = 20;
  14. const int k10 = 10;
  15. int len;
  16. vector<Ll> ar;
  17. vector<int> less_than;
  18. vector<Ll> hlp;
  19.  
  20. int Digit(Ll num, int par) {
  21.   Ll mod = pow(k10, par + 1);
  22.   Ll div = pow(k10, par);
  23.   return num % mod / div;
  24. }
  25.  
  26. void PrecountLessThan(int par) {
  27.   less_than.assign(k10, 0);
  28.   for (int id = 0; id < len; ++id) {
  29.     int dig = Digit(ar[id], par);
  30.     less_than[dig]++;
  31.   }
  32. }
  33.  
  34. void CountLessThan() {
  35.   int cnt = 0;
  36.   for (int id = 0; id < k10; ++id) {
  37.     int point = less_than[id];
  38.     less_than[id] = cnt;
  39.     cnt += point;
  40.   }
  41. }
  42.  
  43. void LSD(int par) {
  44.   PrecountLessThan(par);
  45.   CountLessThan();
  46.   // sort непосредственно по par-й цифре с конца
  47.   for (int id = 0; id < len; ++id) {
  48.     int dig = Digit(ar[id], par);
  49.     hlp[less_than[dig]] = ar[id];
  50.     less_than[dig]++;
  51.   }
  52.   ar = hlp;
  53. }
  54.  
  55. int main() {
  56.   /*std::ios::sync_with_stdio(false);
  57.   std::cin.tie(0);
  58.   std::cout.tie(0);*/
  59.   cin >> len;
  60.   ar.resize(len);
  61.   hlp.resize(len);
  62.   for (Ll& el : ar) {
  63.     cin >> el;
  64.   }
  65.   // sort-им по каждой цифре с конца (В long long  не более 20ти цифр)
  66.   for (int par = 0; par < k20; ++par) {
  67.     LSD(par);
  68.   }
  69.   for (Ll el : ar) {
  70.     cout << el << "\n";
  71.   }
  72. }
  73.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement