rembocoder

Untitled

May 12th, 2023
681
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.27 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. #define int int64_t
  6.  
  7. void count_sm(string& s, vector<int>& sm) {
  8.     s.push_back(0);
  9.     int n = s.size();
  10.  
  11.     int alpha = 256;
  12.  
  13.     vector<vector<int>> where_char(alpha);
  14.     for (int i = 0; i < n; i++) {
  15.         where_char[(unsigned char)(s[i])].push_back(i);
  16.     }
  17.  
  18.     sm.clear();
  19.     sm.reserve(n);
  20.     vector<int> cl(n);
  21.     for (int i  = 0; i < where_char.size(); i++) {
  22.         for (int j: where_char[i]) {
  23.             sm.push_back(j);
  24.             cl[j] = i;
  25.         }
  26.     }
  27.  
  28.     for (int len = 1; len < n; len *= 2) {
  29.         vector<vector<pair<int, int>>> baskets(max(n, alpha));
  30.         for (int i = 0; i < n; i++) {
  31.             int pos = (sm[i] - len + n) % n;
  32.             baskets[cl[pos]].push_back({pos, cl[sm[i]]});
  33.         }
  34.         sm.clear();
  35.         sm.reserve(n);
  36.         int cur_cl = 0;
  37.         for (int i = 0; i < baskets.size(); i++, cur_cl++) {
  38.             for (int j = 0; j < baskets[i].size(); j++) {
  39.                 if (j > 0 && baskets[i][j - 1].second != baskets[i][j].second) {
  40.                     cur_cl++;
  41.                 }
  42.                 int pos = baskets[i][j].first;
  43.                 cl[pos] = cur_cl;
  44.                 sm.push_back(pos);
  45.             }
  46.         }
  47.     }
  48.  
  49.     s.pop_back();
  50.     n--;
  51.  
  52.     vector<int> new_sm;
  53.     new_sm.reserve(n);
  54.     for (int i: sm) {
  55.         if (i < n) {
  56.             new_sm.push_back(i);
  57.         }
  58.     }
  59.     sm = new_sm;
  60. }
  61.  
  62. int32_t main() {
  63.     ios_base::sync_with_stdio(false);
  64.     cin.tie(0); cout.tie(0);
  65.     string s;
  66.     cin >> s;
  67.     int n = s.size();
  68.     vector<int> sm;
  69.     count_sm(s, sm);
  70.  
  71.     vector<int> where(n);
  72.     for (int i = 0; i < n; i++) {
  73.         where[sm[i]] = i;
  74.     }
  75.  
  76.     vector<int> lcp(n - 1);
  77.     int cur = 0;
  78.     for (int i = 0; i < n; i++) {
  79.         if (where[i] + 1 == n) {
  80.             cur = 0;
  81.             continue;
  82.         }
  83.         int j = sm[where[i] + 1];
  84.         while (i + cur < n && j + cur < n && s[i + cur] == s[j + cur]) {
  85.             cur++;
  86.         }
  87.         lcp[where[i]] = cur;
  88.         cur = max(0ll, cur - 1);
  89.     }
  90.  
  91.     for (int i = 0; i < n; i++) {
  92.         cout << s.substr(sm[i]) << endl;
  93.         if (i + 1 < n) {
  94.             cout << lcp[i] << endl;
  95.         }
  96.     }
  97. }
  98.  
Advertisement
Add Comment
Please, Sign In to add comment