Advertisement
Guest User

Untitled

a guest
Dec 8th, 2019
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.54 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. vector<int> ZFunction(string s) {
  6.   int n = s.size();
  7.   vector<int> z(n, 0);
  8.   int L = 0, R = 0;
  9.   for (int i = 1; i < n; i++) {
  10.     if (i > R) {
  11.       L = R = i;
  12.       while (R < n && s[R - L] == s[R]) R++;
  13.       z[i] = R - L; R--;
  14.     } else {
  15.       int k = i-L;
  16.       if (z[k] < R - i + 1) z[i] = z[k];
  17.       else {
  18.         L = i;
  19.         while (R < n && s[R - L] == s[R]) R++;
  20.         z[i] = R - L; R--;
  21.       }
  22.     }
  23.   }
  24.   return z;
  25. }
  26.  
  27. struct DSU {
  28.   int n; vector<int> L, R; vector<bool> ers;
  29.   DSU(int n) : n(n), L(n), R(n), ers(n, false) {
  30.     for (int i = 0; i < n; ++i)
  31.       L[i] = R[i] = i;
  32.   }
  33.   int Erase(int x) {
  34.     int ret = -1;
  35.  
  36.     int l = (x == 0 ? -1 : L[x - 1]);
  37.     int r = (x + 1 == n ? -1 : R[x + 1]);
  38.     if (l != -1 && r != -1) {
  39.       ret = r - l;
  40.     }
  41.     if (l != -1) R[l + 1] = r;
  42.     if (r != -1) L[r - 1] = l;
  43.     ers[x] = true;
  44.     return ret;
  45.   }
  46. };
  47.  
  48. int main() {
  49.   string s; cin >> s;
  50.   int n = s.size();
  51.   auto z = ZFunction(s);
  52.   vector<int> dp(n, 0);
  53.   z[0] = n;
  54.  
  55.   vector<pair<int, int>> v(n);
  56.   for (int i = 0; i < n; ++i)
  57.     v[i] = make_pair(z[i], i);
  58.   sort(v.begin(), v.end());
  59.  
  60.   int at = 0;
  61.   int max_diff = 1;
  62.   DSU dsu(n);
  63.  
  64.   for (int len = 1; len <= n; ++len) {
  65.     while (at < n && v[at].first < len) {
  66.       max_diff = max(max_diff, dsu.Erase(v[at].second));
  67.       ++at;
  68.     }
  69.     if (max_diff <= len && !dsu.ers[n - len]) {
  70.       cout << len << endl;
  71.       return 0;
  72.     }
  73.   }
  74.  
  75.   assert(false);
  76. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement