Guest User

Untitled

a guest
Jul 10th, 2021
161
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.13 KB | None | 0 0
  1. #include<cstdlib>
  2. #include<cstdint>
  3.  
  4. //From: https://graphics.stanford.edu/~seander/bithacks.html#ZerosOnRightLinear
  5. unsigned int trailing_zeros(unsigned int v)
  6. {
  7.     unsigned int c = 32;
  8.     v &= -signed(v);
  9.     if (v) c--;
  10.     if (v & 0x0000FFFF) c -= 16;
  11.     if (v & 0x00FF00FF) c -= 8;
  12.     if (v & 0x0F0F0F0F) c -= 4;
  13.     if (v & 0x33333333) c -= 2;
  14.     if (v & 0x55555555) c -= 1;
  15.  
  16.     return c;
  17. }
  18.  
  19. class Counter
  20. {
  21. private:
  22.     const unsigned int k;
  23.     int64_t **counters;
  24.  
  25. public:
  26.     Counter(const unsigned int k) : k(k)
  27.     {
  28.         const unsigned int n = 1u << k;
  29.         counters = new int64_t*[n];
  30.         for(unsigned int i=0; i<n; i++)
  31.         {
  32.             unsigned int z = trailing_zeros(i);
  33.             z = (z<=k)?z:(k+1);                
  34.             counters[i] = new int64_t[z];
  35.             for(unsigned int j=0; j<z; j++)
  36.                 counters[i][j] = 0;
  37.         }
  38.     }
  39.    
  40.     ~Counter()
  41.     {
  42.         const unsigned int n = 1u << k;
  43.         for(unsigned int i=0; i<n; i++)
  44.             delete[] counters[i];
  45.        
  46.         delete[] counters;
  47.     }
  48.    
  49.     void offset(unsigned int i, const unsigned int delta)
  50.     {
  51.         i++;
  52.         unsigned int x = 0;
  53.         for(int j = k; i; j--)
  54.         {
  55.             unsigned int y = (1u << j);
  56.             if(i & y)
  57.             {            
  58.                 counters[x][j]+=delta;            
  59.                 x+=y;
  60.                 i&=~y;
  61.             }
  62.         }
  63.     }
  64.    
  65.     int64_t eval(unsigned int i)
  66.     {
  67.         int64_t r = 0;
  68.         for(int j=0; j<=k; j++)
  69.         {
  70.             unsigned int y = (1u << j);
  71.             if(i & y)
  72.                 i &= ~y;            
  73.             else
  74.                r+=counters[i][j];
  75.         }
  76.        
  77.         return r;
  78.     }
  79. };
  80.  
  81.  
  82. int main()
  83. {
  84.     const unsigned int k = 12;
  85.     const unsigned int n = 1u << k;
  86.    
  87.     Counter C(k);
  88.     for(unsigned int i=0; i<n; i++)
  89.     {
  90.         C.offset(i, 1);
  91.         for(unsigned int j=0; j<n; j++)
  92.             if(C.eval(j) != ((j<=i)?(i+1-j):0))
  93.                 return EXIT_FAILURE;
  94.     }
  95.    
  96.     return EXIT_SUCCESS;
  97. }
Advertisement
Add Comment
Please, Sign In to add comment