Advertisement
Guest User

Untitled

a guest
Jan 20th, 2018
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.44 KB | None | 0 0
  1. const int MAX = 100 * 1000 + 47;
  2. const int LEN = 18; // ceil(log(MAX))
  3. const int ALP = 128; // Alphabet size
  4.  
  5. int CL[LEN][MAX];
  6. int P[LEN][MAX];
  7. int CNT[MAX];
  8. int POS[MAX];
  9. int lastLev; // P[lastLev] - final array
  10.  
  11. void build(const string& s)
  12. {
  13.     int n = SZ(s);
  14.     FOR(i, 0, n)
  15.     {
  16.         CNT[s[i]]++;
  17.     }
  18.  
  19.     int sum = 0;
  20.     FOR(i, 0, ALP)
  21.     {
  22.         POS[i] = sum;
  23.         sum += CNT[i];
  24.     }
  25.  
  26.     FOR(i, 0, n)
  27.     {
  28.         P[0][POS[s[i]]++] = i;
  29.     }
  30.  
  31.     CL[0][P[0][0]] = 0;
  32.     FOR(i, 1, n)
  33.     {
  34.         int cur = P[0][i];
  35.         int prev = P[0][i - 1];
  36.         CL[0][cur] = CL[0][prev];
  37.         if (s[cur] != s[prev]) CL[0][cur]++;
  38.     }
  39.  
  40.     lastLev = LEN - 1;
  41.     FOR(it, 1, LEN)
  42.     {
  43.         if ((1 << (it - 1)) >= n)
  44.         {
  45.             lastLev = it - 1;
  46.             break;
  47.         }
  48.  
  49.         FILL(CNT, 0);
  50.         FOR(i, 0, n)
  51.         {
  52.             CNT[CL[it - 1][i]]++;
  53.         }
  54.  
  55.         int sum = 0;
  56.         FOR(i, 0, n)
  57.         {
  58.             POS[i] = sum;
  59.             sum += CNT[i];
  60.         }
  61.  
  62.         FOR(i, 0, n)
  63.         {
  64.             int x = P[it - 1][i] - (1 << (it - 1));
  65.             if (x < 0) x += n;
  66.  
  67.             int cl = CL[it - 1][x];
  68.             P[it][POS[cl]++] = x;
  69.         }
  70.  
  71.         CL[it][P[it][0]] = 0;
  72.         FOR(i, 1, n)
  73.         {
  74.             int cur = P[it][i];
  75.             int prev = P[it][i - 1];
  76.             CL[it][cur] = CL[it][prev];
  77.  
  78.             if (CL[it - 1][cur] != CL[it - 1][prev])
  79.             {
  80.                 CL[it][cur]++;
  81.                 continue;
  82.             }
  83.  
  84.             int cc = cur;
  85.             cur += 1 << (it - 1);
  86.             if (cur >= n) cur -= n;
  87.             prev += 1 << (it - 1);
  88.             if (prev >= n) prev -= n;
  89.  
  90.             if (CL[it - 1][cur] != CL[it - 1][prev])
  91.             {
  92.                 CL[it][cc]++;
  93.             }
  94.         }
  95.     }
  96. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement