Advertisement
Mlxa

Suffix array

Feb 6th, 2019
145
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.64 KB | None | 0 0
  1. #define _GLIBCXX_DEBUG
  2. #include <bits/stdc++.h>
  3. using namespace std;
  4. typedef long long ll;
  5. #define long ll
  6. #define all(x) begin(x), end(x)
  7.  
  8.  
  9.  
  10. int main() {
  11.     ios::sync_with_stdio(false);
  12.     cin.tie(nullptr);
  13.    
  14.     string s;
  15.     cin >> s;
  16.     s += '#';
  17.     int n = (int)s.size();
  18.     s += s;
  19.    
  20.     vector<int> array;      /// Position -> suffix.
  21.     vector<int> new_e(n);   /// New equiv.
  22.     vector<int> equiv(n);   /// Classes of equivalence.
  23.     static const int MAX_N = 1e5 + 5;
  24.     static vector<int> bucket[MAX_N];
  25.    
  26.    
  27.     for (int i = 0; i < n; ++i) {
  28.         equiv[i] = s[i];
  29.         bucket[equiv[i]].push_back(i);
  30.     }
  31.     array.clear();
  32.     for (int i = 0; i < 256; ++i) {
  33.         for (int suf : bucket[i]) {
  34.             array.push_back(suf);
  35.         }
  36.         bucket[i].clear();
  37.     }
  38.        
  39.     for (int l = 1; l < n; l *= 2) {
  40.         int max_class = 0;
  41.         for (int ind = 0; ind < n; ++ind) {
  42.             int suf = (array[ind] + n - l) % n;
  43.             // Test resize vs clear.
  44.             // Test mem allocators.
  45.             // Global.
  46.             // int fir = array[ind] - l + n * (array[ind] < l);
  47.             // int fir = array[ind] < l ? array[ind] + n - l : array[ind] - l;
  48.             max_class = max(max_class, equiv[suf]);
  49.             bucket[equiv[suf]].push_back(suf);
  50.         }
  51.         array.clear();
  52.         for (int i = 0; i <= max_class; ++i) {
  53.             for (int suf : bucket[i]) {
  54.                 array.push_back(suf);
  55.             }
  56.             bucket[i].clear();
  57.         }
  58.         new_e[array[0]] = 0;
  59.         for (int i = 1; i < n; ++i) {
  60.             int x = array[i], y = array[i - 1];
  61.             new_e[x] = new_e[y];
  62.             assert(equiv[x] >= equiv[y]);
  63.             if (equiv[x] > equiv[y] || equiv[(x + l) % n] > equiv[(y + l) % n]) {
  64.                 ++new_e[x];
  65.             }
  66.         }
  67.         equiv = new_e;
  68.     }
  69.    
  70.     for (int i = 1; i < n; ++i) {
  71.         cout << array[i] << '\n';
  72.     }
  73.     return 0;
  74. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement