Advertisement
999ms

SuffixArray simple

Feb 20th, 2020
269
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.20 KB | None | 0 0
  1. struct SuffixArray {
  2.   string s;
  3.   int n;
  4.   vector<int> arr;
  5.   SuffixArray(const string& str)
  6.     : s(str + char(0))
  7.     , n(size(s))
  8.     , arr(n)
  9.   {
  10.     vector<int> c(n), buff(c);
  11.     iota(all(arr), 0);
  12.     for (int deg = 0; (1 << (deg - 1)) < n; deg++) {
  13.       if (deg == 0) {
  14.         sort(all(arr), [&] (int i, int j) { return s[i] < s[j]; });
  15.         for (int i = 1; i < n; i++) {
  16.           c[arr[i]] = c[arr[i - 1]] + (s[arr[i]] == s[arr[i - 1]] ? 0 : 1);
  17.         }
  18.       } else {
  19.         int len = 1 << (deg - 1);
  20.         sort(all(arr), [&] (int i, int j) {
  21.           return c[i] < c[j] || (c[i] == c[j] && c[(i + len) % n] < c[(j + len) % n]);
  22.         });
  23.         for (int i = 1; i < n; i++) {
  24.           buff[arr[i]] = buff[arr[i - 1]];
  25.           if (c[arr[i]] != c[arr[i - 1]]) {
  26.             buff[arr[i]]++;
  27.             continue;
  28.           }
  29.           if (c[(arr[i] + len) % n] != c[(arr[i - 1] + len) % n]) {
  30.             buff[arr[i]]++;
  31.             continue;
  32.           }
  33.         }
  34.         for (int i = 0; i < n; i++) {
  35.           c[i] = buff[i];
  36.         }
  37.       }
  38.     }
  39.   }
  40.   void Print() {
  41.     for (int val : arr) {
  42.       cout << val << ' ';
  43.     }
  44.     cout << '\n';
  45.   }
  46. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement