Advertisement
Guest User

Untitled

a guest
Jan 20th, 2018
51
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.46 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 = -1; // 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.     FOR(it, 1, LEN)
  41.     {
  42.         if ((1 << (it - 1)) >= n)
  43.         {
  44.             lastLev = it - 1;
  45.             break;
  46.         }
  47.  
  48.         FILL(CNT, 0);
  49.         FOR(i, 0, n)
  50.         {
  51.             CNT[CL[it - 1][i]]++;
  52.         }
  53.  
  54.         int sum = 0;
  55.         FOR(i, 0, n)
  56.         {
  57.             POS[i] = sum;
  58.             sum += CNT[i];
  59.         }
  60.  
  61.         FOR(i, 0, n)
  62.         {
  63.             int x = P[it - 1][i] - (1 << (it - 1));
  64.             if (x < 0) x += n;
  65.  
  66.             int cl = CL[it - 1][x];
  67.             P[it][POS[cl]++] = x;
  68.         }
  69.  
  70.         CL[it][P[it][0]] = 0;
  71.         FOR(i, 1, n)
  72.         {
  73.             int cur = P[it][i];
  74.             int prev = P[it][i - 1];
  75.             CL[it][cur] = CL[it][prev];
  76.  
  77.             if (CL[it - 1][cur] != CL[it - 1][prev])
  78.             {
  79.                 CL[it][cur]++;
  80.                 continue;
  81.             }
  82.  
  83.             int cc = cur;
  84.             cur += 1 << (it - 1);
  85.             if (cur >= n) cur -= n;
  86.             prev += 1 << (it - 1);
  87.             if (prev >= n) prev -= n;
  88.  
  89.             if (CL[it - 1][cur] != CL[it - 1][prev])
  90.             {
  91.                 CL[it][cc]++;
  92.             }
  93.         }
  94.     }
  95.  
  96.     if (lastLev == -1) lastLev = LEN - 1;
  97. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement