Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- #include <set>
- #include <unordered_map>
- #include <algorithm>
- #include <string>
- #include <unordered_set>
- #include <list>
- #include <map>
- #include <queue>
- #define mp make_pair
- #define i64 long long;
- #define ui64 unsigned long long;
- using namespace std;
- string s;
- int n;
- vector<int> c;
- vector<int> v;
- bool cmp(int a, int b) {
- return s[a] < s[b];
- }
- int length = 1;
- bool cmp1(int a, int b) {
- if (c[a] != c[b]) {
- return c[a] < c[b];
- }
- return c[(a + length) % n] < c[(b + length) % n];
- }
- int main() {
- #ifdef _KOCH
- freopen("input.txt", "r", stdin);
- #else
- //freopen("common.in", "r", stdin);
- //freopen("common.out", "w", stdout);
- #endif
- cin >> s;
- int a1 = s.size();
- s += '$';
- v.resize(s.size());
- c.resize(s.size());
- n = s.size();
- for (int i = 0; i < v.size(); ++i) {
- v[i] = i;
- }
- stable_sort(v.begin(), v.end(), cmp);
- int kek = 0;
- c[v[0]] = 0;
- for (int i = 1; i < v.size(); ++i) {
- if (s[v[i]] == s[v[i - 1]]) {
- c[v[i]] = kek;
- }
- else {
- kek++;
- c[v[i]] = kek;
- }
- }
- for (; length <= v.size(); length *= 2) {
- stable_sort(v.begin(), v.end(), cmp1);
- kek = 0;
- vector<int> tmp(n);
- tmp[v[0]] = 0;
- for (int i = 1; i < v.size(); ++i) {
- if (cmp1(v[i], v[i - 1]) == cmp1(v[i - 1], v[i])) {
- tmp[v[i]] = kek;
- }
- else {
- kek++;
- tmp[v[i]] = kek;
- }
- }
- swap(c, tmp);
- }
- std::vector<int> rev(n);
- vector<int> lcp(n);
- for (int i = 0; i < n; ++i) {
- rev[v[i]] = i;
- }
- for (int i = 0, k = 0; i < n; ++i)
- {
- if (k > 0) {
- k--;
- }
- if (rev[i] == n - 1)
- {
- k = 0;
- continue;
- }
- int j = v[rev[i] + 1];
- while (max(i + k, j + k) < n && s[i + k] == s[j + k]) {
- k++;
- }
- lcp[rev[i]] = k;
- }
- lcp.insert(lcp.begin(), 0);
- int res = 0;
- int x = 0;
- for (int i = 1; i < n; ++i) {
- if (((v[i] < a1 && v[i - 1] > a1) || (v[i] > a1 && v[i - 1] < a1)) && res < lcp[i]) {
- res = lcp[i];
- x = v[i];
- }
- }
- int64_t sum1 = 0;
- int64_t sum2 = 0;
- for (auto elem : v) {
- sum1 += n - elem - 1;
- }
- for (int i = 1; i < n; ++i) {
- sum2 += lcp[i];
- }
- cout << sum1 - sum2 << endl;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement