Advertisement
newb_ie

suffix array

Sep 24th, 2020
180
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.37 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3.  
  4. int main () {
  5.      ios::sync_with_stdio(false);
  6.      cin.tie(nullptr);
  7.      cout.tie(nullptr);
  8.      int T = 1;
  9.      //~ cin >> T;
  10.      for (int t = 1; t <= T; ++t) {
  11.         string s;
  12.         cin >> s;
  13.         s += '$';
  14.         int n = s.size();
  15.         int order[n]; // order
  16.         int class_[n]; // equivalent class
  17.         pair<char,int> pos[n]; // position
  18.         for (int i = 0; i < n; ++i) {
  19.             pos[i] = make_pair(s[i],i);
  20.         }
  21.         sort(pos, pos + n);
  22.         for (int i = 0; i < n; ++i) {
  23.             order[i] = pos[i].second;
  24.         }
  25.         class_[order[0]] = 0;
  26.         for (int i = 1; i < n; ++i) {
  27.             if (pos[i].first == pos[i - 1].first) {
  28.                 class_[order[i]] = class_[order[i - 1]];
  29.             } else {
  30.                 class_[order[i]] = class_[order[i - 1]] + 1;
  31.             }
  32.         }
  33.         int k = 0;
  34.         while ((1 << k) < n) {
  35.             pair<pair<int,int>,int> suf[n]; //positon array
  36.             for (int i = 0; i < n; ++i) {
  37.                 suf[i] = make_pair(make_pair(class_[i],class_[(i + (1 << k)) % n]),i);
  38.             }
  39.             sort(suf,suf + n);
  40.             for (int i = 0; i < n; ++i) {
  41.                 order[i] = suf[i].second;
  42.             }
  43.             class_[order[0]] = 0; // first class to be order[0] = 0
  44.             for (int i = 1; i < n; ++i) {
  45.                 if (suf[i].first == suf[i - 1].first) {
  46.                     class_[order[i]] = class_[order[i - 1]];
  47.                 } else {
  48.                     class_[order[i]] = class_[order[i - 1]] + 1;
  49.                 }
  50.             }
  51.             k += 1;
  52.         }
  53.         for (int i = 0; i < n; ++i) {
  54.             cout << order[i] << " ";
  55.         }
  56.      }
  57. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement