Advertisement
Guest User

Untitled

a guest
Apr 1st, 2020
92
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.50 KB | None | 0 0
  1. #include <iostream>
  2. #include <bits/stdc++.h>
  3.  
  4. using namespace std;
  5. string s;
  6. int n;
  7. vector<int> cnt;
  8. vector<int> p;
  9. vector<int> c;
  10. int p_temp[10000000];
  11. int c_temp[10000000];
  12.  
  13. int main() {
  14.     cin >> s;
  15.     s += '$';
  16.     n = s.size();
  17.     cnt.resize(27);
  18.     p.resize(s.size());
  19.     c.resize(s.size());
  20.     for (size_t j = 0; j < s.size(); ++j) {
  21.         if (s[j] == '$') {
  22.             ++cnt[0];
  23.         } else {
  24.             ++cnt[s[j] - 'a' + 1];
  25.         }
  26.     }
  27.     for (size_t j = 1; j < 27; ++j) {
  28.         cnt[j] += cnt[j - 1];
  29.     }
  30.     for (size_t j = 0; j < s.size(); ++j) {
  31.         p[--cnt[max(0, s[j] - 'a' + 1)]] = j;
  32.     }
  33.     c[p[0]] = 0;
  34.     int class_equiv = 0;
  35.     for (size_t j = 1; j < s.size(); ++j) {
  36.         if (s[p[j]] != s[p[j - 1]]) {
  37.             ++class_equiv;
  38.         }
  39.         c[p[j]] = class_equiv;
  40.     }
  41.     ++class_equiv;
  42.     for (int i = 0; (1 << i) < n; ++i) {
  43.         for (int j = 0; j < n; ++j) {
  44.             p_temp[j] = (p[j] - (1 << i) + n) % n;
  45.         }
  46.         cnt.resize(class_equiv);
  47.         fill(cnt.begin(), cnt.end(), 0);
  48.         for (int j = 0; j < n; ++j) {
  49.             ++cnt[c[p_temp[j]]];
  50.         }
  51.         for (int j = 1; j < class_equiv; ++j) {
  52.             cnt[j] += cnt[j - 1];
  53.         }
  54.         for (int j = n - 1; j >= 0; --j) {
  55.             p[--cnt[c[p_temp[j]]]] = p_temp[j];
  56.         }
  57.         c_temp[p[0]] = 0;
  58.         class_equiv = 0;
  59.         for (int j = 1; j < n; ++j) {
  60.             int m1 = (p[j] + (1 << i)) % n;
  61.             int m2 = (p[j - 1] + (1 << i)) % n;
  62.             if (c[p[j]] != c[p[j - 1]] || c[m1] != c[m2])
  63.                 ++class_equiv;
  64.             c_temp[p[j]] = class_equiv;
  65.         }
  66.         ++class_equiv;
  67.         for (int j = 0; j < n; ++j) {
  68.             c[j] = c_temp[j];
  69.         }
  70.     }
  71.     for (int i = 1; i < n; ++i) {
  72.         cout << p[i] + 1 << " ";
  73.     }
  74.     vector<int> lcp;
  75.     vector<int> pos;
  76.     lcp.resize(n);
  77.     pos.resize(n);
  78.     for (int i = 0; i < n; ++i) {
  79.         pos[p[i]] = i;
  80.     }
  81.     int k = 0;
  82.     for (int i = 0; i < n; ++i) {
  83.         if (k > 0)
  84.             --k;
  85.         if (pos[i] == n - 1) {
  86.             lcp[n - 1] = -1;
  87.             k = 0;
  88.             continue;
  89.         } else {
  90.             int j = p[pos[i] + 1];
  91.             while (max(i + k, j + k) < n && s[i + k] == s[j + k]) {
  92.                 ++k;
  93.             }
  94.             lcp[pos[i]] = k;
  95.         }
  96.     }
  97.     cout << endl;
  98.     for (int i = 1; i < n - 1; ++i) {
  99.         cout << lcp[i] << " ";
  100.     }
  101. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement