Advertisement
Guest User

Blocked Booyer-Moore

a guest
Aug 27th, 2012
289
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.40 KB | None | 0 0
  1. unsigned int* p;
  2. unsigned int m;
  3.  
  4. unsigned int* delta_2;
  5.  
  6. /************* Preprocessing ************/
  7. void bs_init(char* _p, unsigned int _m)
  8. {
  9.     if(p != NULL) delete [] p;
  10.     ++p = new unsigned int[2 + (_m / 4)];
  11.     memcpy(p, _p, _m / 4);
  12.     m = _m;
  13.  
  14.     if(delta_2 != NULL) delete [] delta_2;
  15.     delta_2 = new unsigned int[m];
  16.  
  17.     unsigned int pcpy[m / 32];
  18.     memcpy(pcpy, p, (m / 8));
  19.  
  20.     int i = m;
  21.     while(--i >= 0)
  22.     {
  23.         toggle_bit(i, pcpy);
  24.  
  25.         int j = m - 1;
  26.         while(--j >= 0)
  27.         {
  28.             int k = m - i;
  29.  
  30.             int s = j - k + 1;
  31.             while((--k >= 0) && (read_bit(s + k, p) == read_bit(i + k, pcpy)))
  32.             {
  33.                 if((k == 0) || ((s + k) == 0))
  34.                     goto end_search;
  35.             }
  36.  
  37.         }
  38.  
  39.         end_search:
  40.  
  41.         delta_2[i] = m - j - 1;
  42.         toggle_bit(i, pcpy);
  43.     }
  44. }
  45.  
  46. /************* Searching ************/
  47. inline unsigned int ceil_div(unsigned int a, unsigned int b)
  48. {
  49.     return (a + b - 1) / b;
  50. }
  51.  
  52. inline unsigned int bs_last(unsigned int sh)
  53. {
  54.     return ceil_div(sh + m, 32);
  55. }
  56.  
  57. inline unsigned int bs_mask(unsigned int sh, unsigned int j)
  58. {
  59.     int a = sh - ((j - 1) * 32);
  60.     int b = a + m;
  61.  
  62.     a = std::max(a, 0);
  63.     b = std::min(b, 32);
  64.  
  65.     return ((1ull << b) - (1ull << a));
  66. }
  67.  
  68. inline unsigned int bs_pat(unsigned int sh, unsigned int j)
  69. {
  70.     return (p[j - 1] << sh) | ((unsigned long long)p[j - 2] >> (32 - sh));
  71. }
  72.  
  73. inline unsigned int bs_nrz(unsigned int indic)
  74. {
  75.     return __builtin_clz(indic);
  76. }
  77.  
  78. inline unsigned int bit_search(unsigned int* t, unsigned int a, unsigned int b)
  79. {
  80.     unsigned int sh = a % 32;
  81.     unsigned int i = bs_last(a);
  82.     unsigned int lastbit = a + m;
  83.     while(i <= ceil_div(b, 32))
  84.     {
  85.         unsigned int j = bs_last(sh);
  86.         unsigned int sl = 1 + ((m + sh - 1) % 32);
  87.         unsigned int indic;
  88.         while((j > 0) && ((indic = (t[i-1] ^ bs_pat(sh, j)) & bs_mask(sh, j)) == 0))
  89.         {
  90.             i--;
  91.             j--;
  92.         }
  93.  
  94.         if(j == 0) return 32 * i + sh + m;
  95.         else
  96.         {
  97.             unsigned int matchlen = sl + bs_nrz(indic) + ((bs_last(sh) - j - 1) * 32);
  98.             unsigned int delta2 = delta_2[m - matchlen - 1];
  99.             lastbit += delta2;
  100.             i = ceil_div(lastbit, 32);
  101.             sh = (lastbit - m) % 32;
  102.         }
  103.     }
  104.  
  105.     return 0;
  106. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement