Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- #define int int64_t
- void count_sm(string& s, vector<int>& sm) {
- s.push_back(0);
- int n = s.size();
- int alpha = 256;
- vector<vector<int>> where_char(alpha);
- for (int i = 0; i < n; i++) {
- where_char[(unsigned char)(s[i])].push_back(i);
- }
- sm.clear();
- sm.reserve(n);
- vector<int> cl(n);
- for (int i = 0; i < where_char.size(); i++) {
- for (int j: where_char[i]) {
- sm.push_back(j);
- cl[j] = i;
- }
- }
- for (int len = 1; len < n; len *= 2) {
- vector<vector<pair<int, int>>> baskets(max(n, alpha));
- for (int i = 0; i < n; i++) {
- int pos = (sm[i] - len + n) % n;
- baskets[cl[pos]].push_back({pos, cl[sm[i]]});
- }
- sm.clear();
- sm.reserve(n);
- int cur_cl = 0;
- for (int i = 0; i < baskets.size(); i++, cur_cl++) {
- for (int j = 0; j < baskets[i].size(); j++) {
- if (j > 0 && baskets[i][j - 1].second != baskets[i][j].second) {
- cur_cl++;
- }
- int pos = baskets[i][j].first;
- cl[pos] = cur_cl;
- sm.push_back(pos);
- }
- }
- }
- s.pop_back();
- n--;
- vector<int> new_sm;
- new_sm.reserve(n);
- for (int i: sm) {
- if (i < n) {
- new_sm.push_back(i);
- }
- }
- sm = new_sm;
- }
- int32_t main() {
- ios_base::sync_with_stdio(false);
- cin.tie(0); cout.tie(0);
- string s;
- cin >> s;
- int n = s.size();
- vector<int> sm;
- count_sm(s, sm);
- vector<int> where(n);
- for (int i = 0; i < n; i++) {
- where[sm[i]] = i;
- }
- vector<int> lcp(n - 1);
- int cur = 0;
- for (int i = 0; i < n; i++) {
- if (where[i] + 1 == n) {
- cur = 0;
- continue;
- }
- int j = sm[where[i] + 1];
- while (i + cur < n && j + cur < n && s[i + cur] == s[j + cur]) {
- cur++;
- }
- lcp[where[i]] = cur;
- cur = max(0ll, cur - 1);
- }
- for (int i = 0; i < n; i++) {
- cout << s.substr(sm[i]) << endl;
- if (i + 1 < n) {
- cout << lcp[i] << endl;
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment